छिपी हुई फ़ाइलों को पुन: कॉपी करना - लिनक्स


19

क्या किसी निर्देशिका में सभी छिपी हुई फ़ाइलों को किसी अन्य निर्देशिका में पुन: कॉपी करने का एक आसान तरीका है? मैं एक घर निर्देशिका में सभी सेटिंग्स फ़ाइलों का बैकअप लेना चाहता हूं, न कि सामान्य फाइलें। मैंने कोशिश की:

cp -R .* directory

लेकिन यह पहचानता है .और ..सभी गैर-छिपी हुई फ़ाइलों को भी पुन: कॉपी करता है। वहाँ एक तरीका है cp को अनदेखा करने के लिए .और ..?


क्या कोई अंतर है -rऔर -R?
चामिंडा बंदारा

जवाबों:


15

सामान्य रूप से डायर को स्थानांतरित करने के लिए मेरा पसंदीदा रहा है:

tar cvf - . | (cd /dest/dir; tar xvf -)

जो वर्तमान निर्देशिका को स्टडआउट करने के लिए टार्स करता है, फिर इसे एक उपधारा में पाइप करता है जो कि अनटर्डन स्टड से पहले डेस्टिनेशन डायरेक्टरी के पहले सीडी है। सरल, प्रत्यक्ष, एक्स्टेंसिबल - विचार करें कि क्या होता है जब आप एक (ssh) को दूसरी मशीन से प्रतिस्थापित करते हैं। या आप कर सकते हैं अपने सवाल का जवाब देने के लिए:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
धन्यवाद, बहिष्कृत विकल्प वह है जिसकी मुझे आवश्यकता है। मैंने इसे दूसरे तरीके से पहले ही कर लिया है, लेकिन मैं इसे भविष्य में संदर्भ के लिए रखूंगा। यह वास्तव में लचीला लगता है (हालांकि शायद धीमा)।
ज़िफरे

1
अच्छी सलाह। मेरे पास कुछ सुधार हैं: 1) उपयोग करें cd /dest/dir && tar xvf -&&स्रोत निर्देशिका से अधिक blatting यदि आप गंतव्य लिखने में कोई गलती है से आप बंद हो जाएगा। 2) आपको केवल vटार कमांड (या न ही) में से किसी एक पर टैर फ्लैग की आवश्यकता है ।
टॉम शॉ

काफी उचित। मुझे दूसरी तरह से समूह बनाने के लिए भी जाना जाता है: एक दूरस्थ srcdir को यहाँ कॉपी करने के लिए,(cd /src/dir && tar cf - .) | tar xvf -
pjz

17

लगभग हर बार इसे सिर्फ हल किया जा सकता है:

cp -R .[a-zA-Z0-9]* directory

यह एक छुपी हुई फ़ाइल के लिए बहुत असामान्य है जो उन पात्रों में से एक के साथ शुरू नहीं होती है।

अन्य पैटर्न मैच उपलब्ध हैं ( .??*, .[^.]*) - टिप्पणियां देखें


यह केवल अनदेखा करेगा। xyz - [] में सामान डॉट के बाद केवल पहले अक्षर से मेल खाता है।
हामिश डाउनर

6
। [^।] * सब कुछ पकड़
लेगा

1
... दो पीरियड से शुरू होने वाले सामान को छोड़कर।
फाल्स्ट्रो

@roe - यह भी एक अच्छा संस्करण है
Alnitak

@ मीश - हां, मैंने जवाब में उतना ही कहा।
अलनीतक

11

आप उपयोग कर सकते हैं rsync

rsync -a ./ /some/other/directory/

वह वर्तमान निर्देशिका की सामग्री की प्रतिलिपि बनाएगा (डॉट फ़ाइलों सहित, लेकिन शामिल नहीं ..)


सरल, और छिपे हुए फ़ोल्डर में छिपी फ़ाइलों के लिए भी काम करता है।
user59183

मेरे लिए यह कम भ्रामक है और प्रदान किए गए समाधानों में से सबसे प्रभावी है
palerdot

अच्छा समाधान है। मुझे यह भी आवश्यक था कि मैं .gitडायरियों की नकल न करूं । जोड़ना -C ऐसा करता है और इसलिए कमांड बन जाता है:rsync -aC ./ /some/other/directory/
ther

10

मैं आपको फंसाता हूं, 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/ \;

कदम से कदम स्पष्टीकरण:

  • -Hfindसिम्बलिंक का पालन न करने का कारण होगा (सिवाय इसके कि वास्तविक टॉपलेवल निर्देशिका नाम जो आपने दिया है वह सिम्लिंक है; कि यह अनुसरण करेगा)।
  • /path/to/toplevel/dir/ जाहिर है, माना जाता है कि आपके द्वारा पथ को निर्देशिका के साथ प्रतिस्थापित किया जाना है जो उन सेटिंग्स फ़ाइलों और निर्देशिकाओं को होस्ट करता है जिन्हें आप बैकअप करना चाहते हैं।
  • -maxdepth 1findकिसी भी निर्देशिका में जिसका नाम डॉट से शुरू होता है, में पुन: आने से रुक जाएगा । हमें इसकी पुनरावृत्ति करने की आवश्यकता नहीं 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 / पर प्रारंभ करें। किसी भी उपनिर्देशिका में न उतरें। उन सभी निर्देशिकाओं, फ़ाइलों और सिमिलिंक का पता लगाएं, जिनका नाम डॉट से शुरू होता है। जो आपने पाया है, उनमें से प्रत्येक के लिए, इसे / पाथ / टू / डेस्टिनेशन / डीआईआर / नेचर, परमिशन और एक्सटेंडेड एट्रीब्यूट्स को कॉपी करें।


1
खोज अब तक की सबसे उपयोगी चीज है।
श्री शाइनी और न्यू 安 Sh

1
अच्छा उत्तर। हालांकि मैं -exec पसंद करता हूं ... ';' बैकस्लैश से बचने का मतलब है कि यह कमांड सीएलआई और
क्रॉस्टेब

8

मैंने हमेशा उपयोग किया है। * * बिना छुए छुपी हुई फाइलों को खोजने के लिए "।" तथा ".."। यह ".a" या कुछ और याद आ सकता है, हालांकि, लेकिन मेरे पास उनमें से एक नहीं है।


निश्चित रूप से अच्छा और साफ-सुथरा :) +1
फाल्स्ट्रो

मैं इसे रहस्यमय तरीके से विफल नहीं करना चाहता अगर कुछ ".a" s
Zifre

मुझे यह पसंद है क्योंकि यदि आप जानते हैं कि आपके पास कोई एकल वर्ण छिपी हुई फ़ाइलें नहीं हैं, तो यह वास्तव में टाइप करने के लिए तेज़ है।
पॉल टॉम्बलिन

यह सबसे अच्छा जवाब होना चाहिए। इसे ऊपर तक उखाड़ा जाना चाहिए।
इब्न सईद

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.