Cp का उपयोग करके एक फ़ाइल को कई निर्देशिकाओं में कॉपी करना


12

यह सवाल मेरे पहले के प्रश्न का एक क्रम है, जिसमें कई निर्देशिकाओं का उपयोग करके बनाया गया हैmkdir

मैं bashशेल का इस्तेमाल कर रहा हूं । मैंने पचास निर्देशिकाएँ बनाई हैं, जिनमें से प्रत्येक उपसर्ग "s" से शुरू होती है, कमांड का उपयोग करते हुए:

mkdir $(printf "s%02i " $(seq 1 50))

शून्य के साथ दूसरे अंक के लिए कौन सा पैड। है यही कारण है, निर्देशिका है कि मैं प्राप्त के रूप में हैं s01, s02, ..., s49, s50

अब मैं प्रत्येक पचास निर्देशिकाओं के cpलिए एक फ़ाइल (उदाहरण के लिए test.txt) की प्रतिलिपि बनाने के लिए उपयोग करना चाहूंगा । क्या यह एक तरह से ऊपर के अनुरूप होना संभव है? उदाहरण के लिए, निम्नलिखित कार्य होगा? मैं यूनिक्स / लिनक्स के लिए अपेक्षाकृत नया हूं, इसलिए मैं वास्तव में यह कोशिश नहीं करना चाहता जब तक कि कोई कृपया मुझे संकेत न दे कि यह सुरक्षित है।

cp test.txt $ (printf "s% 02i.txt" $ (seq 1 50))

इसके manलिए पृष्ठ को देखते हुए cp, ऐसा नहीं लगता cpहै कि इस तरह से कई स्थलों का समर्थन करता है:

NAME
       cp - copy files and directories

SYNOPSIS
       cp [OPTION]... [-T] SOURCE DEST
       cp [OPTION]... SOURCE... DIRECTORY
       cp [OPTION]... -t DIRECTORY SOURCE...

DESCRIPTION
       Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

जवाबों:


7

यदि आप फ़ाइल का उपयोग करके प्रत्येक निर्देशिका में फ़ाइल को कॉपी करने के लिए अपनी कमांड से आउटपुट का उपयोग करना चाहते हैं cp, तो आप इसे हमेशा पाइप कर सकते हैं xargs:

printf "s%02i " $(seq 1 50) | xargs -n 1 cp test.txt

आउटपुट को पार्स करने की सुरक्षा के बारे में कोई चिंता नहीं होनी चाहिए क्योंकि जब आप इसके प्रारूप और सामग्री को हाथ से पहले जानते हैं - फ़ाइल नाम में मेटा वर्णों और स्थान से मुठभेड़ का जोखिम वास्तव में यहां कोई समस्या नहीं है।

वैकल्पिक रूप से, पहले से मौजूद निर्देशिकाओं को मानते हुए, आप कुछ इस तरह की कोशिश कर सकते हैं:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -print0 | xargs -0 -I {} cp test.txt {}

या बिना किसी पाइप के:

find . -maxdepth 1 -type d -name 's[0-9][0-9]' -exec cp test.txt {} \;

अंतिम दो कमांड वर्तमान निर्देशिका में और cp test.txtउनके पास कोई भी फाइल पाएंगे । -maxdepth 1विकल्प के रूप में अच्छी तरह से फ़ाइल प्राप्त करने के लिए किसी भी उप निर्देशिकाओं से बचने जाएगा। चेतावनी दी जा रही है कि किसी भी दो अंकों के बाद 's[0-9][0-9]'मिलान sकिया जा रहा है, जिसका अर्थ है कि अगर किसी कारण से आपके पास s99है cwd, तो इसकी एक प्रति भी प्राप्त होगी test.txt


8

आप शेल को forलूप के साथ पुनरावृत्तियों को भी करने दे सकते हैं । यह सबसे बुनियादी तरीका है कि जैसे बाहरी उपकरण पर निर्भर नहीं करता है parallelया xargs, और मैं इसे सबसे आसान समझने के लिए लगता है:

for name in $(printf "s%02i " $(seq 1 50)); do
    mkdir $name
    cp test.txt $name
done

इसे लिखने के एक लाख अन्य तरीके हैं, जैसे:

for name in $(seq -w 1 50); do
    mkdir s$name
    cp test.txt s$name
done

यदि आप यह सत्यापित करना चाहते हैं कि इसे करने से पहले क्या निष्पादित किया जाएगा, तो आप कुछ ऐसा कर सकते हैं जैसे कि कमांडों को तैयार करना echo, जो इसे निष्पादित करने के बजाय लाइन को प्रिंट करेगा:

for name in $(seq -w 1 50); do
    echo mkdir s$name
    echo cp test.txt s$name
done

आउटपुट:

mkdir s01
cp test.txt s01
mkdir s02
cp test.txt s02
mkdir s03
cp test.txt s03
# etc.


2

आप GNU का समानांतर उपयोग भी कर सकते हैं । मान लें कि आपकी निर्देशिका text.txt युक्त है और आपके 50 dirs /my/50dirs/path(जैसे /my/50dirs/path/s01, /my/50dirs/path/s02आदि) में स्थित हैं , आप चलाएंगे:

seq -w 01 50 | parallel -j1 cp text.txt /my/50dirs/path/s{}

2
बेहतर यह है कि parallel -j1, अन्यथा प्रति कोर एक नौकरी होगी, और एक मल्टीकोर मशीन पर नौकरियां IO के लिए प्रतिस्पर्धा करेंगी।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.