लिनक्स में छिपी (डॉट के साथ शुरू) फाइलें और उपनिर्देशिका की नकल कैसे करें?


10

फ़ोल्डर ए में फ़ोल्डर बी में छिपी हुई फ़ाइलों और छिपी उपनिर्देशिकाओं (डॉट के साथ शुरू होने वाले) की प्रतिलिपि कैसे करें? उदाहरण के लिए यदि मेरे पास यह संरचना है:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

मैं बी में छिपी हुई फाइलों और ए में छिपी उपनिर्देशिकाओं की प्रतिलिपि बनाना चाहता हूं:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

मैं पहले से ही इस आदेश की कोशिश की है: cp A/.* Bसे यह अन्य सुपर उपयोगकर्ता सवाल । हालाँकि, यह उपनिर्देशिकाओं की नकल नहीं करता है। भी कोशिश की cp -r A/.* B, लेकिन यह प्रतियां .तो मैं ए (सामान्य फ़ाइलों सहित) की एक सटीक प्रतिलिपि के साथ समाप्त होता है। किसी भी मदद की सराहना की है।

जवाबों:


16

जब तक आप केवल ए के स्तर पर छिपी हुई फ़ाइलों और फ़ोल्डरों की तलाश कर रहे हैं और उदाहरण के लिए नहीं चाहते हैं

A/b/.hidden

नकल करने के लिए, आपको इसका उपयोग करने में सक्षम होना चाहिए:

cp -r A/.[^.]* B

यह मूल रूप से इसका मतलब है कुछ भी है कि एक के साथ शुरू होता कॉपी .और उसके बाद किसी भी चरित्र अन्य एक से .यही बाहर फिल्टर .और..

संपादित करें: क्योंकि कमांडर ने संकेत नहीं दिया है कि वह किसी भी मालिकाना, तारीख आदि को संरक्षित करना चाहता है, क्योंकि cp कमांड से -p हटाया गया।


यह प्रश्न में दिए गए उदाहरण फ़ाइल और निर्देशिका नामों के लिए काम करता है , लेकिन प्रश्न का पाठ "छिपी हुई फाइलें और छिपी उपनिर्देशिकाएं (डॉट के साथ शुरू होने वाले)" कहता है, और यह उत्तर उन फ़ाइलों और निर्देशिकाओं को नहीं मिलेगा जिनके नाम से शुरू होता है दो डॉट्स; जैसे, ..c
स्कॉट

यह काफी एज केस है, लेकिन कम-से-कम एक वैध चिंता है। मैंने ऐसा नहीं माना था। आप इसके लिए स्विच कर सकते हैं, .*[^.]लेकिन तब आप फ़ाइलों को याद करेंगे जो एक के साथ समाप्त होती हैं .। मुझे लगता है कि वास्तव में आपको सभी मामलों के लिए विस्तारित ग्लोबिंग की आवश्यकता होगी।
सर्वव्यापी

4

इसके साथ समस्या A/.*यह है कि निर्देशिका .है Aजिसमें पैटर्न से भी मेल खाता है।

आप विस्तारित ग्लोब पैटर्न को चालू कर सकते हैं और निम्नलिखित का उपयोग कर सकते हैं:

shopt -s extglob
cp -r A/.!(?(.)) B    

यह उन फाइलों से मेल खाता है, जिनका नाम डॉट से शुरू होता है और जिसका दूसरा वर्ण न तो डॉट है और न ही ((?) कुछ नहीं या डॉट से मेल खाता है; (...) इसे नकारता है, अर्थात (? (?)) हर चीज से मेल खाता है। कुछ नहीं या डॉट से)।


एक सही उत्तर के लिए +1। ध्यान दें कि .!(@(|.))(AFAICT) उपरोक्त के बराबर है, (IMNSHO) थोड़ा स्पष्ट है, और केवल एक वर्ण लंबा है।
स्कॉट

3

इस तरह के मामलों के लिए इस तरह के findबजाय का उपयोग करने की सिफारिश करेंगे cp:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

मूल सिंटैक्स इस तरह टूट जाता है:

  • find A/ -type f: findनिर्देशिका में आइटम A/जिसका प्रकार एक फ़ाइल है (निर्देशिका के बजाय) ...
  • -maxdepth 1 -name '.*': इसके लिए maxdepth1 डायरेक्टरी और जिसके nameसाथ शुरुआत होती है .
  • -exec cp -p {} B/ \;: और एक बार इन फ़ाइलों पाए जाते हैं, एक साथ आदेश झंडा दिनांकों को बचाने के लिये / स्रोत (से गुना के गंतव्य के लिए) ।execcp-p{}B/

मुझे maxdepthनियंत्रण की एक परत जोड़ने का उपयोग करना पसंद है इसलिए मैं गलती से पूरे फाइल सिस्टम को कॉपी नहीं कर रहा हूं। लेकिन बेझिझक इसे हटा दें।


0
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type d केवल निर्देशिका के साथ ए के भीतर एक पुनरावर्ती सूची प्रदान करता है
  • grep -E "\." एक डॉट के साथ निर्देशिका निर्देशिका (यानी: छिपी निर्देशिका)
  • यहाँ -E विकल्प की आवश्यकता थी क्योंकि इसके बिना इसका अर्थ "वर्तमान निर्देशिका" भी है
  • बैकलैश का अर्थ "किसी भी चरित्र" के regexp के तहत, अर्थ से बचना है
  • cp -r पुनरावर्ती प्रतिलिपि बनाने के लिए

मैंने ए के लिए फ़ाइलें और फ़ोल्डर्स की संरचना बनाई है और गिट बैश में कमांड निष्पादित किया है (मैं अभी एक लिनक्स के साथ नहीं हूं) और यह काम किया।


यह तब टूटता है जब फाइलों में उनके नाम या रास्ते में व्हाट्सएप या विशेष अक्षर होते हैं।
16

ध्यान देने योग्य बात के लिए धन्यवाद :) वास्तव में मैं @gaboroncancio द्वारा "टेस्ट केस" तक सीमित था। यदि आप मुझे अन्य परीक्षण बैटरी दे सकते हैं तो मैं इसे बेहतर बनाने की कोशिश कर सकता हूं (यदि आप चाहें, तो इस प्रतिक्रिया को संपादित करके या एक नया उत्तर बनाकर अपने आप में सुधार करें)
malarres

आप बस नामक फ़ोल्डर में डॉटफ़ाइल्स डाल सकते हैं A B, और फिर यह अप्रत्याशित रूप से कार्य करेगा क्योंकि इसका विस्तार होगा cp -r A B/.dotfile B। सामान्य सलाह पार्स findया lsआउटपुट के लिए बिल्कुल भी नहीं है। यदि आप उपयोग करते हैं findतो आपको इसके बजाय फ़िल्टर करने के लिए अपने स्वयं के विकल्पों का उपयोग करना चाहिए grep, और यदि आप findआउटपुट को कहीं और पाइप करते हैं -print0, तो उपयोग करें , या सीधे उस कमांड को कॉल करें जिसे आप चाहते हैं। find मैनुअल देखें ।
slhck

आम तौर पर और भी अधिक, जब फ़ाइलों के साथ काम करना सबसे सुरक्षित होता है तो शेल ग्लब्स का उपयोग अन्य उत्तरों में बताया जाता है (हालाँकि उन्हें अक्सर extglobसेट करने की आवश्यकता होती है)।
स्लैक

लिंक के लिए धन्यवाद। चलो findपरसिंग तो छोड़ो ।
मैलरेस

0

एक विकल्प के रूप में आप इस अन्य कमांड का उपयोग कर सकते हैं यदि दूसरा वर्ण अल्फ़ान्यूमेरिक ( स्रोत ) है:

cp -r A/.[a-zA-Z0-9]* B

यह प्रश्न में दिए गए उदाहरण फ़ाइल और निर्देशिका नामों के लिए काम करता है , लेकिन प्रश्न का पाठ "छिपी हुई फाइलें और छिपी उपनिर्देशिकाएं (डॉट के साथ शुरू होने वाले)" कहता है, और यह उत्तर उन फ़ाइलों और निर्देशिकाओं को नहीं मिलेगा जिनके नाम से शुरू होता है एक बिंदु और एक विशेष चरित्र; जैसे, .@fooया ..c
स्कॉट

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