सभी उपनिर्देशिकाओं से एक निश्चित विस्तार के साथ सभी फ़ाइलों की प्रतिलिपि बनाएँ


112

यूनिक्स के तहत, मैं सभी उपनिर्देशिकाओं से दूसरे निर्देशिका में एक निश्चित एक्सटेंशन (सभी एक्सेल फाइल) के साथ सभी फाइलों को कॉपी करना चाहता हूं। मेरे पास निम्न कमांड है:

cp --parents `find -name \*.xls*` /target_directory/

इस आदेश के साथ समस्याएं हैं:

  • यह निर्देशिका संरचना को भी कॉपी करता है, और मैं केवल फाइलें चाहता हूं (इसलिए सभी फाइलें / target_directory /) में समाप्त होनी चाहिए

  • यह फ़ाइल नाम में रिक्त स्थान वाली फ़ाइलों की प्रतिलिपि नहीं बनाता है (जो कि बहुत कम हैं)

इन समस्याओं का कोई समाधान?


किस बारे में find... exec mv?
फेडोरक्वी 'एसओ ने'

जवाबों:


174

--parents निर्देशिका संरचना की प्रतिलिपि बना रहा है, इसलिए आपको इससे छुटकारा पाना चाहिए।

जिस तरह से आप यह लिखा है, findकार्यान्वित, और आउटपुट कमांड लाइन ऐसा है कि पर डाल दिया जाता है cpफ़ाइल नामों को अलग रिक्त स्थान, और रिक्त स्थान के बीच भेद नहीं कर सकते भीतर फ़ाइल नाम। कुछ करना बेहतर है

$ find . -name \*.xls -exec cp {} newDir \;

जिसमें cpप्रत्येक फ़ाइलनाम के लिए निष्पादित किया जाता findहै, जो फ़ाइल नाम को सही ढंग से ढूंढता है और पारित करता है। यहाँ इस तकनीक के बारे में अधिक जानकारी है

उपरोक्त सभी के बजाय, आप zsh और बस प्रकार का उपयोग कर सकते हैं

$ cp **/*.xls target_directory

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


2
हाँ। 'बिन इट' का मतलब है इसे फेंक देना। अब संशोधित :-)
ब्रायन एग्न्यू

13
Bash4.0+ और ksh93समर्थन भी करता है **। बैश के लिए, shopt -s globstarइसे सक्षम करने के लिए उपयोग करें। Ksh के लिए, यह set -Gया है set -o globstar
pynexj

2
@ डेरिल - मैं आगे भर चुका हूं। लेकिन जवाब पहले से ही 'स्वीकृत' के रूप में चिह्नित किया गया था, ध्यान दें
ब्रायन एग्न्यू

5
यह निष्पादन xargs में पास होने की तुलना में तकनीकी रूप से कम कुशल है, जो संभव के रूप में कुछ सीपी कॉल में यह सब करेगा: find . -name '*.xls' -print0 | xargs -0 cp -t destdir
ताइवे

2
@BrianAgnew ओह, मुझे यकीन है, सिर्फ स्वच्छंद भोगियों के लिए टिप्पणियों में अतिरिक्त जानकारी होना अच्छा है।
तैवे

37

उपरोक्त सभी से, मैं इस संस्करण के साथ आया था। यह संस्करण मैक रिकवरी टर्मिनल में भी मेरे लिए काम करता है।

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

यह xsl एक्सटेंशन वाली फ़ाइलों के लिए वर्तमान निर्देशिका और पुनरावर्ती सभी उप निर्देशिकाओं में दिखेगा। यह उन सभी को लक्ष्य निर्देशिका में कॉपी कर देगा।

सीपी झंडे हैं:

  • पी - फ़ाइल की विशेषताएँ संरक्षित करें
  • आर - पुनरावर्ती
  • v - क्रिया (आपको पता चलता है कि नकल की जा रही है)

1
यह वही है जो मुझे तब करना था जब ब्लूहॉस्ट में SSH'd था।
प्लमर

4
यह उपसमूह को प्रस्तुत नहीं करता है।
b005t3r

3
@ b005t3r जो कि डिजाइन के अनुसार है, यह माना नहीं जाता है। ओपी के सवाल का पूरा आशय यही था। वह उपनिर्देशिकाओं से सभी फाइलों को बिना किसी निर्देशिका में कॉपी किए
सबडायरेस

2
क्या उप-निर्देशिकाओं को संरक्षित करने के लिए इसे संशोधित करने का कोई तरीका है?
मैथ्यू डीन

8

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मैंने इसका उपयोग करके हल किया:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'और ";"प्रत्येक फ़ाइल पर प्रतिलिपि निष्पादित करता है।


3

मुझे खुद भी ऐसा करना पड़ा। मैंने इसे cp के लिए --parents तर्क के माध्यम से किया:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

1
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

आप --parents को हटा सकते हैं, लेकिन यदि कई फाइलें एक ही नाम की हैं तो टकराव का खतरा है।

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