कमांड लाइन का उपयोग करके कई फ़ोल्डरों में फाइल कॉपी कैसे करें?


67

मैंने test.txtएक आदेश के साथ एक फ़ाइल को कई निर्देशिकाओं में कॉपी करने की कोशिश की है :

cp ~/test.txt ~/folder1 ~/folder2

लेकिन मैं सफल नहीं हुआ। क्या ऐसा करने का एक तरीका है कि एक कमांड में मैं एक फाइल या एक फ़ोल्डर को कई निर्देशिकाओं में कॉपी कर सकूं?


आसानी से नहीं। आप किसी फ़ोल्डर की कई मौजूदा प्रतियों को कुशलतापूर्वक अपडेट करने के लिए "rsync" में देखना चाहते हैं
Thorbjørn Ravn Andersen

3
थोड़ा सा बैश-स्क्रिप्ट सीखने की कोशिश करें। यह बहुत उपयोगी हो सकता है:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
शाहबाज

एक ही आदेश नहीं, लेकिन कुछ लोगों की मदद कर सकते हैं, जो यहाँ पर ठोकर खाते हैं:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
मनु जेर्विनवेन

जवाबों:


71

cpकई स्रोतों से कॉपी कर सकते हैं, लेकिन कई गंतव्यों पर कॉपी नहीं कर सकते। man cpअधिक जानकारी के लिए देखें ।

एकमात्र बैश कमांड जो मुझे पता है कि जो कई गंतव्यों को कॉपी / सेव कर सकता है tee

आप इसे अपने मामले में इस प्रकार उपयोग कर सकते हैं:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

ध्यान दें कि teeमानक आउटपुट (स्टडआउट) को इनपुट भी लिखते हैं। इसलिए यदि आप यह नहीं चाहते हैं, तो आप मानक आउटपुट को पुनर्निर्देशित करके इसे निम्नानुसार रोक सकते /dev/nullहैं:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

10
चतुर, कि धोखा है! :)
terdon

5
+1, चतुर! और यदि आप >/dev/nullटर्मिनल को
गड़बड़ाने के

1
आपके लिए +1, आपका हमेशा मा आदमी :), लेकिन क्या होगा अगर मैं एक निर्देशिका की प्रतिलिपि बनाना चाहता हूं?
nux

2
@nux निर्देशिकाओं के मामले में -rविकल्प का उपयोग करना न भूलेंcp
Radu Rădeanu

4
@ नक्स: प्रतियों के teeविपरीत cpकेवल फ़ाइल की सामग्री को उसके मोड, स्वामित्व, टाइमस्टैम्प की अनदेखी करना। : फ़ाइल नाम दोहरा से बचने के लिएf=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
JFS

61

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

find dir1 dir2 -exec cp file.txt {} \;

यदि dir1 या dir2 में उप-निर्देशिकाएँ हैं, जो आप फ़ाइल की प्रतिलिपि नहीं बनाना चाहते हैं, तो -maxdepth 0विकल्प जोड़ें :

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

ध्यान दें कि यह में हर फ़ाइल के ऊपर लिख देगा dir1और dir2साथ file.txtकॉपी करने की सामग्री के अलावा,। file.txtइन निर्देशिकाओं में अन्य फ़ाइलों को प्रभावित किए बिना केवल कॉपी करने के लिए, केवल निर्देशिकाओं findपर कार्य करने के लिए कहें :

find dir1 dir2 -type d -exec cp file.txt {} \;

4
अच्छा समाधान! मुझे टी के साथ की तुलना में अधिक सही लगता है।
दनाटेला

1
वास्तव में, कोई पुनर्निर्देशन शामिल नहीं है और यह अभी भी एक आदेश है।
सिल्वेन पिनेउ

2
@ सिल्वेनपिन्यू वास्तव में 3 हैं: एक है findऔर दो बार (इस मामले में) cp। यह कहने के लिए नहीं कि findबहुत समय चाहिए।
राडू रियडेनू

3
यदि एक "कमांड" की परिभाषा एक "निष्पादन" कॉल है, तो हो सकता है, लेकिन यह मेरी पुस्तक में "एक कमांड" है।
कोजिरो

2
मैं इस पर वापस आ रहा हूं, इसलिए सोचा कि मुझे एक उत्थान देना चाहिए: D
जोनाथन

31

आदेश

cp ~/test.txt ~/folder1 ~/folder2

गंतव्य पर दो फ़ाइलों ( ~/test.txtऔर ~/folder1) को कॉपी करने का प्रयास करता है folder2। (और यदि ~/folder2मौजूद है और एक निर्देशिका है, तो आपके पास "छोड़ने की निर्देशिका" चेतावनी होगी)।

यदि आप फ़ाइल की कई प्रतियां बनाना चाहते हैं test.txt, तो आपको एक लूप या कई कमांड का उपयोग करना होगा ...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... और सावधान रहें यदि आपके पास फ़ाइल नामों में स्थान रिक्त हैं, तो आपको उद्धरण की आवश्यकता होगी)।

संपूर्ण निर्देशिकाओं की प्रतिलिपि बनाने के लिए आपको -rविकल्प का उपयोग करना होगा :

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

यह बनाएगा ~/folder1/folder3और ~/folder2/folder3शामिल सभी फाइलों के साथ।


1
गुजरने वाले पाठक के लिए: युक्ति के अनुसार , एक लूप एक मिश्रित कमांड है। इसलिए यह अभी भी एक आदेश है, और प्रश्न के लिए सभी आवश्यकताओं को पूरा करता है।
कोजिरो

@nux, मैं सुधारों पर सहमत नहीं हूं। 1) दो राजधानियाँ गलत हैं, मेरा अभिप्राय वाक्यांश में आज्ञाओं का अंतर करना था। 2) दीर्घवृत्त शैली का विषय है; कृपया मेरी शैली को जाने दो।
रमानो

1
ठीक है, मैं माफी चाहता हूँ आदमी, मैंने सोचा कि यह बेहतर लगेगा।
नक्स

मेरे सिस्टम पर, यह फ़ोल्डर 3 को ~ / folder1 / folder3 के रूप में नहीं बचाता है, बल्कि फ़ोल्डर 3 में सब कुछ कॉपी करता है folder1
Alpha_989

23

आप एक सहायता स्क्रिप्ट बना सकते हैं, या आप इसे xargsऔर प्रिंट फ़ंक्शन (इस मामले में echo) के साथ कर सकते हैं :

echo firstDir secondDir | xargs -n 1 cp test

यह पैरामीटर के रूप में परीक्षण फ़ाइल cpका उपयोग करके प्रत्येक निर्देशिका को फ़ंक्शन के तर्क के रूप में बना देगा ।


यह शायद सवाल का सबसे अच्छा / सबसे सीधा जवाब है
ब्रायसन एस।

7

एक लंबे खोज के बाद यह काम भी एक आकर्षण की तरह!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

यह टर्मिनल में आपके वर्तमान स्थान के प्रत्येक निर्देशिका में file.txt की प्रतिलिपि बनाएगा ।

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

यह टर्मिनल में आपके वर्तमान स्थान के प्रत्येक उप निर्देशिका में एक फ़ोल्डर की प्रतिलिपि बनाएगा।

मैं इसे साझा करता हूं आशा करता हूं कि यह दूसरों की भी मदद करता है।


में zsh, आप for i in *(/); ...सभी उपनिर्देशिकाओं पर लूप का उपयोग कर सकते हैं , ताकि आप [ -d ...परीक्षण से बच सकें । विस्तारित ग्लोबिंग एक कारण है जो मुझे पसंद है bash
रमानो

क्या आपका अधिकार एक कमांड में फिर से कोड हो सकता है
nux

1
में zsh, इस उत्तर की पहली कमांड को सरल बनाया जा सकता है for dir in *(/); do cp /path/file.txt "$dir"; done। देखें zsh.sourceforge.net/Intro/intro_2.html
Rmano

5
आप किसी भी बॉर्न व्युत्पन्न खोल में परीक्षण को खत्म कर सकते हैंfor dir in */;
हेनक लैंगवेल्ड

@ नक्स यह वास्तव में अच्छी तरह से काम करता है और कमांड का पालन करना बहुत आसान है। यह बहुत अधिक मतदान किया जाना चाहिए!
nukeguy

1

यदि आप हर निर्देशिका में फ़ाइल test.txt को कॉपी करना चाहते हैं / tmp / target / ...

एक परीक्षण वातावरण बनाएँ:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

इसे कॉपी करें:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;

0

बस के जवाब को एक बदलाव देने के लिए सोचा Sylvain Pineau

आपकी वर्तमान निर्देशिका में कहां dir1और dir2क्या नहीं है।

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

यहां खोज dir1दो स्तरों के लिए गहरी दिखेगी या आप मौजूदा निर्देशिका में सभी फ़ोल्डरों में और इसके नीचे -maxdepthखोजने के लिए पैरामीटर छोड़ सकते हैं dir1

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