मैं आपको फंसाता हूं, cp
कमांड लाइन पर सादे खोल विस्तार से दूर - शेल विस्तार में सभी प्रकार के अहम "दिलचस्प" कोने के मामले हैं (अवांछित पुनरावृत्ति। और .., रिक्त स्थान, गैर-मुद्रण योग्य सामान, हार्डलिंक, प्रतीकात्मक लिंक, और। find
इसके बजाय ।) इसके बजाय उपयोग करें (यह findutils
पैकेज में आता है , अगर आपके पास यह स्थापित नहीं है - जो अजीब होगा, सभी वितरण डिफ़ॉल्ट रूप से इसे स्थापित करते हैं):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
कदम से कदम स्पष्टीकरण:
-H
find
सिम्बलिंक का पालन न करने का कारण होगा (सिवाय इसके कि वास्तविक टॉपलेवल निर्देशिका नाम जो आपने दिया है वह सिम्लिंक है; कि यह अनुसरण करेगा)।
/path/to/toplevel/dir/
जाहिर है, माना जाता है कि आपके द्वारा पथ को निर्देशिका के साथ प्रतिस्थापित किया जाना है जो उन सेटिंग्स फ़ाइलों और निर्देशिकाओं को होस्ट करता है जिन्हें आप बैकअप करना चाहते हैं।
-maxdepth 1
find
किसी भी निर्देशिका में जिसका नाम डॉट से शुरू होता है, में पुन: आने से रुक जाएगा । हमें इसकी पुनरावृत्ति करने की आवश्यकता नहीं cp
है, हमारे लिए ऐसा ही होगा, हमें इस स्तर पर केवल नामों की आवश्यकता है।
-name '.*'
बताता है find
कि हम सभी नाम चाहते हैं जो डॉट से शुरू होते हैं। पर्यावरण चर POSIXLY_CORRECT
सेट होने पर यह सही ढंग से काम नहीं करेगा , लेकिन यह शायद ही कभी (यदि कभी है)। यह पहला मैच की स्थिति है जो हमने अब तक निर्दिष्ट की है।
a \( ....... \)
एक है और कोष्ठक में एक अधिक जटिल हालत के बाद (मैं का उपयोग किया है ..... इसे बदलना, यह नीचे की व्याख्या।) हम के बाद से वे अन्यथा (गलत) खोल से व्याख्या हो जाएगा कोष्ठकों से बचने के लिए की जरूरत है, इसलिए उनके सामने पीछे,
-type d -o -type f -o -type l
या उनके बीच तीन स्थितियां हैं। -type d
निर्देशिकाओं से मेल खाता है, -type f
नियमित फ़ाइलों से -type l
मेल खाता है , और सहानुभूति से मेल खाता है। आप चुन सकते हैं कि आप क्या चाहते हैं - उदाहरण के लिए, यदि आप बैकअप सेटिंग्स निर्देशिकाओं को छोड़ना नहीं चाहते हैं, तो छोड़ दें -type d
(और इसके -o
ठीक पीछे, जाहिर है।)
-exec ..... \;
find
हर बार मैच का सामना करने पर एक कमांड निष्पादित करने के लिए कहता है। कमांड के अंत को एक अर्धविराम द्वारा चिह्नित किया गया है, जिसे हमें शेल व्याख्या से बचने के लिए फिर से बैकस्लैश के साथ भागने की आवश्यकता है। उस कमांड लाइन के भीतर, आपको उस जगह का उपयोग करने की आवश्यकता है {}
जहां आप चाहते हैं कि वर्तमान में मिला हुआ मैच का नाम समाप्त हो जाए। चूंकि गोले भी घुंघराले ब्रेसिज़ की गलत व्याख्या कर सकते हैं, इसलिए आपको उन्हें एपोस्ट्रोफिस में रखना चाहिए, जैसे कि '{}'
। इस मामले में हम जिस कमांड को निष्पादित करना चाहते हैं, वह है cp -a '{}' /path/to/destination/dir/
(-a का मतलब है आर्काइव, जो उपनिर्देशिकाओं में पुनरावृत्ति करता है, लिंक के रूप में सहानुभूति की प्रतिलिपि बनाता है और अनुमतियों और विस्तारित विशेषताओं को संरक्षित करता है, और /path/to/destination/dir/
जाहिर है कि गंतव्य निर्देशिका का नाम है - इसे प्रतिस्थापित करें।)
तो, सादे अंग्रेजी में, यह find
कमांड लाइन यह कहती है:
/ पथ / से / toplevel / dir / पर प्रारंभ करें। किसी भी उपनिर्देशिका में न उतरें। उन सभी निर्देशिकाओं, फ़ाइलों और सिमिलिंक का पता लगाएं, जिनका नाम डॉट से शुरू होता है। जो आपने पाया है, उनमें से प्रत्येक के लिए, इसे / पाथ / टू / डेस्टिनेशन / डीआईआर / नेचर, परमिशन और एक्सटेंडेड एट्रीब्यूट्स को कॉपी करें।
-r
और-R
?