मैं डॉट नाम से शुरू होने वाली फ़ाइल की प्रतिलिपि कैसे बनाऊँ?


26

मैं निर्देशिका ए के तहत निर्देशिका बी सभी फाइलों को निर्देशिका ए के तहत सभी फाइलों को कॉपी करने के लिए कोशिश कर रहा हूँ डॉट से प्रारंभ हो रहे हैं, उदाहरण के लिए:

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

मैंने पाया जो अगर मैं का उपयोग करें: cp A/* B, हमेशा त्रुटि मिलती है:

cp: cannot stat 'A/*': no such file or directory

ऐसा लगता है वहाँ के लिए कोई विकल्प नहीं है cpके रूप में lsडॉट के साथ शुरू संभाल करने के लिए प्रविष्टियों, किसी को भी विचार कैसे इसे ठीक करना है?

जवाबों:


34

कारण यह है कि में bash, *डॉट से प्रारंभ हो फ़ाइलों को शामिल नहीं करता है ( .)।

तुम दौड़ सकते हो

cp A/.* B

यह आपको चेतावनी देता है कि यह नकल नहीं की थी .या ..किसी भी उपनिर्देशिका, या, लेकिन यह ठीक है।

या, यदि आप एक साथ डॉट फ़ाइलें और सामान्य फ़ाइलों की प्रतिलिपि बनाना चाहते हैं, तो रन

cp A/.* A/* B

तुम भी दौड़ सकते थे

shopt -s dotglob
cp A/* B

जो में काम करेगा bash, लेकिन नहीं sh

और अगर आप कोई आपत्ति नहीं है उपनिर्देशिका भी कॉपी की जा रही है, तो यह सबसे आसान है:

cp -R A/ B

युक्ति: कभी वाइल्डकार्ड नहीं कर रहे हैं, तो आप क्या उम्मीद, गूंज, जैसे के साथ इसे चलाने की कोशिश करें

$ echo A/*
A/file1 A/file2

$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2

$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2

$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2

यदि आप उपयोग करते हैं तो यह केवल एक समस्या है -r। इसके बिना -r, यह केवल निर्देशिकाओं को छोड़ देगा।
मिकेल

और मैं जो उदाहरण देता हूं, उसे -Rठीक काम करना चाहिए। यदि आपको लगता है कि यह गलत है, तो कृपया समझाएं।
मिकेल

7

यदि बैश है, तो dotglobआप कॉपी करने से पहले सेट कर सकते हैं

shopt -s dotglob
cp A/* /destination

या एक प्रोग्रामिंग भाषा

$ ruby -rfileutils -e  'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'

अगर आप डॉटग्लोब सेट नहीं करना चाहते हैं, तो बस

cp A/.* /destination 2>/dev/null

डॉटग्लोब ओपीएल का उपयोग करने से सभी गैर-छिपी हुई फ़ाइलों की प्रतिलिपि भी बन जाएगी, जो कि वह नहीं चाहता है।
पीरो

@peoro, आपको प्रश्न को फिर से पढ़ना चाहिए। में सभी फाइलें Aछिपी हुई हैं। वह बस यही कॉपी करना चाहता है।

7

आप जिन चीज़ों की तलाश कर रहे हैं, वे इनकी तर्ज पर हैं:

cp A/.??* B/

यह सभी डॉटफ़ाइल्स से मेल खाएगा, लेकिन "नहीं।" या ".."। जब तक आप पुनरावर्ती रूप से काम नहीं कर रहे हैं, तब तक उपरोक्त समाधानों में से अधिकांश ठीक हैं। लेकिन जैसे ही आप कुछ करना चाहते हैं:

cp -R A/.??* B/

छोड़ने के बिना ".." आप गैर-डॉटफ़ाइल्स सहित, मूल निर्देशिका से सब कुछ कॉपी करेंगे।


1
यह डॉट-फाइल्स को मिस करेगा जो एक एकल वर्ण हैं, जैसे .aया .x। सबसे छोटा गोलाकार पैटर्न मैंने पाया है कि हर डॉट फ़ाइल को छोड़कर .और ..से मेल खाता है और है .[^.]*
पावन

2

मैं सिर्फ निम्नलिखित की कोशिश की और यह सिर्फ मिल काम करता है ...

cp A/.* B/

2
यह भी पारित करेंगे A/.और A/..करने के लिए पैरामीटर के रूप में cpहै, इस स्थिति ओपी में समस्याग्रस्त किया जा सकता भी (का उपयोग करते हुए निर्देशिका प्रतिलिपि करने की आवश्यकता cp -r)
peoro

2

यही कारण है कि नहीं है cpकी गलती बैश फैलता है: यह पार्टी, *सभी में गैर छिपा हुआ (यानी: के साथ गैर प्रारंभिक .) फ़ाइलें।

बैश का विस्तार होगा .*(इस प्रकार A/.*सभी के साथ शुरू फाइलों के साथ, आपके मामले में) ., लेकिन unluckily यह भी शामिल है .और ..(वर्तमान और माता पिता निर्देशिका) जो आप शायद छोड़ना चाहते होंगे। (नोट अन्य गोले, zsh की तरह, उन्हें शामिल नहीं होता है कि, और IIRC भी बैश, कुछ विकल्प सेट करने के बाद)।

एक आसान समाधान निकालने के लिए हो सकता है .और ..के अनुरूप फाइलों से .*एक (बहुत) इस तरह hacky तरह से,:

cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B

या यह एक (शायद क्लीनर: इसे इस्तेमाल करता है findनकल करने के लिए फ़ाइलों को खोजने के लिए):

cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B

लेकिन आपको संभवतः क्लीनर समाधान मिलेंगे।


यदि आप एक क्यों इस्तेमाल करना चाहिए for loopऔर उसके बाद अतिरिक्त बनाने grepकी प्रक्रिया की तरह ही एक काम करने के लिए cp A/.*? cp"की उपेक्षा करेंगे।" और ".." निर्देशिका।

1

यदि वे सभी एक डॉट के साथ शुरू करते हैं, तो बस उपयोग करें A/.*:

[holt@Michaela test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory

[holt@Michaela test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[holt@Michaela test]$ ls -al B
total 8
drwxrwxr-x. 2 holt holt 4096 2011-03-31 16:57 .
drwxrwxr-x. 4 holt holt 4096 2011-03-31 16:57 ..
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .a
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .b
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .c

उम्मीद है की यह मदद करेगा!


1

आप इस स्क्रिप्ट का उपयोग कर सकते हैं

आईएफएस = $ '\ n'; $ में अभिनय के लिए (लगता है एक -d 1); सीपी आर "$ अधिनियम 'बी करते हैं; किया हुआ


0

कॉपी:

cp A/.* B

सूची:

ls -l A/.*

अवरोही निर्देशिकाओं के बिना सूची की फाइलें:

ls -ld A/.*

0

आपको बाहर करना होगा। और .. फ़ाइलें सूची cp के लिए पारित से!

यह सुरक्षित है:

ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B

0

यह एक पुराना धागा है ... लेकिन मैं हमेशा सभी फाइलों को कॉपी करने में सक्षम रहा हूं। उन फ़ाइलों / फ़ोल्डरों को शामिल करना जो 'से शुरू होते हैं।'

उदाहरण सभी फ़ाइलों और फ़ोल्डरों की नकल करेगा:

cp -aup /root/.* / backup / root /

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