जवाबों:
एकल फ़ाइलों के लिए आप tee
कई स्थानों पर कॉपी करने के लिए उपयोग कर सकते हैं:
cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>
या यदि आप डिमॉगिफ़ाइड संस्करण पसंद करते हैं:
tee <outfile1> <outfile2> > <outfile3> < <inputfile>
ध्यान दें कि जैसा कि डेनिस टिप्पणियों में बताते हैं tee
और stdout
साथ ही सूचीबद्ध फ़ाइलों को भी आउटपुट करते हैं , इसलिए उपरोक्त उदाहरणों में फ़ाइल 3 को इंगित करने के लिए रीडायरेक्ट का उपयोग करते हैं। आप इसे /dev/null
नीचे के रूप में भी पुनर्निर्देशित कर सकते हैं - इसमें फ़ाइल सूची को कमांड लाइन पर अधिक सुसंगत रखने का लाभ है (जो कि फ़ाइलों की चर संख्याओं के समाधान को स्क्रिप्ट करना आसान बना सकता है), लेकिन थोड़ा कम कुशल है (हालांकि दक्षता अंतर छोटा है: cat
संस्करण या बिना संस्करण का उपयोग करने के बीच के अंतर के समान cat
):
cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null
आप संभवतः उपरोक्त find
में से एक को एक निर्देशिका में एकाधिक फ़ाइलों पर संचालित करने के लिए और आसानी से एक निर्देशिका संरचना में फैली फ़ाइलों पर संचालित करने के लिए कम आसानी से जोड़ सकते हैं । अन्यथा आपको बस अलग-अलग कार्यों के रूप में समानांतर में कई कॉपी ऑपरेशन सेट करने पड़ सकते हैं और आशा करते हैं कि ओएस डिस्क कैश उज्ज्वल और / या काफी बड़ा है कि समानांतर कार्यों में से प्रत्येक ने ड्राइव-हेड पैदा करने के बजाय पहले से कैश्ड रीड डेटा का उपयोग किया है। ताड़ना।
उपलब्धता: tee
आमतौर पर मानक लिनक्स सेटअप और अन्य यूनिक्स या यूनिक्स-एक जैसे सिस्टम पर उपलब्ध है, आमतौर पर GNU "कोरुटिल्स" पैकेज के हिस्से के रूप में। यदि आप विंडोज का उपयोग कर रहे हैं (आपका सवाल निर्दिष्ट नहीं करता है) तो आपको इसे विभिन्न विंडोज पोर्ट जैसे कि सिग्विन में ढूंढना चाहिए।
प्रगति की सूचना: ऑप्टिकल मीडिया से बड़ी फ़ाइल को कॉपी करने में कुछ समय लग सकता है (या धीमे नेटवर्क पर, या यहां तक कि स्थानीय फास्ट मीडिया से भी बड़ी फ़ाइल), प्रगति की जानकारी उपयोगी हो सकती है। कमांड लाइन पर मैं प्रयोग करते हैं पाइप दर्शक इस बात के लिए (सबसे Linux distros और कई विंडोज बंदरगाह संग्रह और आसान में उपलब्ध है, जहां नहीं उपलब्ध सीधे अपने आप को संकलित करने के लिए) - बस की जगह cat
के साथ pv
इसलिए की तरह:
pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>
tee
स्टडआउट करने के लिए आउटपुट भी होगा, इसलिए आप ऐसा करना चाह सकते हैं tee outputfile1 outputfile2 < inputfile > /dev/null
क्योंकि टर्मिनल पर एक बाइनरी फ़ाइल को आउटपुट करना शोर और उसकी सेटिंग्स के साथ गड़बड़ हो सकता है।
tar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
विंडोज के लिए:
n2ncopy यह करेगा:
लिनक्स के लिए:
cp
आदेश अकेले कई स्रोतों लेकिन दुर्भाग्य से कई नहीं स्थलों से कॉपी कर सकते हैं। आपको किसी प्रकार के लूप में इसे कई बार चलाने की आवश्यकता होगी। आप एक लूप का उपयोग कर सकते हैं जैसे कि और सभी निर्देशिका नामों को एक फ़ाइल में रखें:
OLDIFS=$IFS
IFS=$'\n'
for line in $(cat file.txt):
do
cp file $line
done
IFS=$OLDIFS
या xargs का उपयोग करें:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
ये दोनों आपको संपूर्ण निर्देशिकाओं / एकाधिक फ़ाइलों की प्रतिलिपि बनाने की अनुमति देंगे। इस StackOverflow लेख में भी चर्चा की गई है ।
इसी तरह के प्रश्न के लिए दिए गए उत्तर के आधार पर एक और तरीका GNU समानांतर का उपयोग cp
एक साथ कई उदाहरण चलाने के लिए है:
parallel -j 0 -N 1 cp file1 ::: Destination1 Destination2 Destination3
उपरोक्त आदेश समानांतर में सभी तीन गंतव्य फ़ोल्डर में file1 की प्रतिलिपि बनाएगा
बैश में (लिनक्स, मैक या साइगविन):
cat source | tee target1 target2 >targetN
(यह प्रतियां STDOUT पर इनपुट है, इसलिए अंतिम लक्ष्य पर पुनर्निर्देशन का उपयोग करें)।
विंडोज में, साइगविन अक्सर ओवरकिल होता है। इसके बजाय, आप केवल एक्सक्स यूटिल्स प्रोजेक्ट से एक्ज़ को जोड़ सकते हैं , जिसमें बिल्ली, टी और कई अन्य शामिल हैं।
रयान थॉम्पसन का समाधान:
for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;
बहुत समझ में आता है: यदि गंतव्य की गति की लेखन गति लगभग समान है, तो srcfile केवल डिस्क से एक बार पढ़ा जाएगा। बाकी समय इसे कैश से पढ़ा जाएगा।
मैं इसे थोड़ा और सामान्य बनाऊंगा, ताकि आप भी वशीभूत हो जाएं:
for x in dest1 dest2 dest3; do cp -a srcdir $x &; done; wait;
यदि डिस्ट डेर्स की लेखन गति बहुत अलग है (जैसे कि एक रैम डिस्क पर और दूसरा NFS पर), तो आप देख सकते हैं कि srcdir को dest1 में कॉपी करते समय पढ़े गए srcdir के हिस्से अब डिस्क कैश में नहीं हैं जब लिखते हैं dest2।
इस उत्तर के अनुसार: /superuser//a/1064516/702806
एक बेहतर समाधान का उपयोग करना है tar
और tee
। आदेश अधिक जटिल है लेकिन tar
हस्तांतरण के लिए बहुत शक्तिशाली है और इसे स्रोत को सिर्फ एक बार पढ़ने की आवश्यकता है।
tar -c /source/dirA/ /source/file1 | tee >(cd /foo/destination3/; tar -x) >(cd /bar/destination2/; tar -x) >(cd /foobar/destination1/; tar -x) > /dev/null
इसे स्क्रिप्ट में उपयोग करने के लिए, आपको अपनी स्क्रिप्ट लॉन्च करने की आवश्यकता हो सकती है bash -x script.sh
tar
, वह यह है कि यह स्वचालित रूप से फ़ाइल विशेषताओं (जैसे, संशोधन दिनांक / समय, (सुरक्षा) मोड और संभावित ACL, स्वामी / समूह (यदि विशेषाधिकार प्राप्त), SELinux को कॉपी (संरक्षित) करेगा) संदर्भ (यदि लागू हो), विस्तारित विशेषताएँ (यदि लागू हो), आदि)…………… पुनश्च उपयोगकर्ता को उपयोग करने की आवश्यकता क्यों होगी bash -x
?
#!/bin/sh
अपनी स्क्रिप्ट की शुरुआत में इस्तेमाल किया था, लेकिन कमांड का सिंटैक्स स्वीकार नहीं किया जाता है। आप अपनी फ़ाइल की शुरुआत में उपयोग bash -x
या उपयोग कर सकते हैं #!/bin/bash
। मुझे नहीं पता कि क्यों sh
और bash
व्याख्याओं के बीच अंतर है ।
बैश में:
for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;
यदि आप Windows में PowerShell से ऐसा करना चाहते हैं, तो यह डिफ़ॉल्ट रूप से संभव नहीं है, क्योंकि -Path
तर्क के विपरीत , -Destination
कई तर्क नहीं लेते हैं। हालाँकि, आप -Passthrough
कमांड का उपयोग और डाइस-चेन कर सकते हैं । (लेकिन यह मज़ेदार नहीं है।)
सबसे अच्छा समाधान अपना खुद का बनाना है, जैसा कि यहां दिखाया गया है ।