एकल स्रोत से कई लक्ष्यों तक समानांतर फाइल कॉपी?


15

मेरे पास ऑप्टिकल मीडिया पर कई बड़ी फाइलें हैं, मैं कई लक्ष्यों को कॉपी करना चाहूंगा - इस मामले में मेरे पास एक ही कंप्यूटर से जुड़ी दो हार्ड ड्राइव हैं। क्या ऐसी उपयोगिता है जो कार्य कर सकती है जैसे:

copy source target1 target2 ... targetN

जवाबों:


23

एकल फ़ाइलों के लिए आप 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>

मुझे Tex.exe UnxUtils पैकेज का हिस्सा लगता है। उत्कृष्ट टिप के लिए धन्यवाद!
गोयूइक्स

5
ध्यान दें कि teeस्टडआउट करने के लिए आउटपुट भी होगा, इसलिए आप ऐसा करना चाह सकते हैं tee outputfile1 outputfile2 < inputfile > /dev/nullक्योंकि टर्मिनल पर एक बाइनरी फ़ाइल को आउटपुट करना शोर और उसकी सेटिंग्स के साथ गड़बड़ हो सकता है।
अगली सूचना तक रोक दिया गया।

निर्देशिका और कई फ़ाइलों के लिए बस बिल्ली के बजाय टार का उपयोग करें। उदाहरण के लिएtar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
सी.आर.

5

विंडोज के लिए:

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 लेख में भी चर्चा की गई है ।


N2NCopy लिंक टूटा हुआ प्रतीत होता है।
वेस्ले


4

इसी तरह के प्रश्न के लिए दिए गए उत्तर के आधार पर एक और तरीका GNU समानांतर का उपयोग cpएक साथ कई उदाहरण चलाने के लिए है:

parallel -j 0 -N 1 cp file1 ::: Destination1 Destination2 Destination3

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


2

बैश में (लिनक्स, मैक या साइगविन):

cat source | tee target1 target2 >targetN

(यह प्रतियां STDOUT पर इनपुट है, इसलिए अंतिम लक्ष्य पर पुनर्निर्देशन का उपयोग करें)।

विंडोज में, साइगविन अक्सर ओवरकिल होता है। इसके बजाय, आप केवल एक्सक्स यूटिल्स प्रोजेक्ट से एक्ज़ को जोड़ सकते हैं , जिसमें बिल्ली, टी और कई अन्य शामिल हैं।


1

रयान थॉम्पसन का समाधान:

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।


1

इस उत्तर के अनुसार: /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


मजेदार। मैंने सोचा कि "इसका कोई मतलब नहीं है, एक उत्थान है"। Upvoted। तब मैंने इस लिंक को चेक किया ...: D
कामिल मैकियोरोस्की

यदि आप एक साथ कई फ़ाइलों की नकल कर रहे हैं, तो यह डेविड स्पिल्ट के (स्वीकृत) उत्तर के लिए काफी स्पष्ट है । एकल स्रोत फ़ाइल के लिए, केवल एक फायदा जो मैं जोड़कर देख सकता हूं tar, वह यह है कि यह स्वचालित रूप से फ़ाइल विशेषताओं (जैसे, संशोधन दिनांक / समय, (सुरक्षा) मोड और संभावित ACL, स्वामी / समूह (यदि विशेषाधिकार प्राप्त), SELinux को कॉपी (संरक्षित) करेगा) संदर्भ (यदि लागू हो), विस्तारित विशेषताएँ (यदि लागू हो), आदि)…………… पुनश्च उपयोगकर्ता को उपयोग करने की आवश्यकता क्यों होगी bash -x?
स्कॉट

मैंने #!/bin/shअपनी स्क्रिप्ट की शुरुआत में इस्तेमाल किया था, लेकिन कमांड का सिंटैक्स स्वीकार नहीं किया जाता है। आप अपनी फ़ाइल की शुरुआत में उपयोग bash -xया उपयोग कर सकते हैं #!/bin/bash। मुझे नहीं पता कि क्यों shऔर bashव्याख्याओं के बीच अंतर है ।
रेमी गिरार्ड

कामिल मैकियोरोव्स्की - मुझे नहीं पता कि आपका जवाब क्यों नहीं है। इसका अचूक उपाय है। मैं इसे साझा करना चाहता था।
रेमी गिरार्ड

0

बैश में:

for x in dest1 dest2 dest3; do cp srcfile $x &>/dev/null &; done; wait;

2
मुझे नहीं लगता कि यह अच्छा प्रदर्शन करेगा। एक आदर्श समानांतर कॉपी में आप एक बार पढ़ रहे होंगे, कई बार लिख रहे होंगे। मुझे लगता है कि यह 1: 1 पढ़ेगा: लिखता है। हो सकता है कि यदि प्रतियाँ पर्याप्त रूप से तेज़ी से शुरू हों और कैश बहुत बड़ा हो तो आपको वास्तव में पढ़े जाने वाले प्रमुखों की तलाश करने की आवश्यकता नहीं होगी।
क्विकोट

0

यदि आप Windows में PowerShell से ऐसा करना चाहते हैं, तो यह डिफ़ॉल्ट रूप से संभव नहीं है, क्योंकि -Pathतर्क के विपरीत , -Destinationकई तर्क नहीं लेते हैं। हालाँकि, आप -Passthroughकमांड का उपयोग और डाइस-चेन कर सकते हैं । (लेकिन यह मज़ेदार नहीं है।)

सबसे अच्छा समाधान अपना खुद का बनाना है, जैसा कि यहां दिखाया गया है

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