जवाबों:
नहीं, cp
कई स्रोतों को कॉपी कर सकते हैं लेकिन केवल एक ही गंतव्य पर कॉपी करेंगे। आपको cp
कई बार - एक बार गंतव्य के लिए - आप क्या करना चाहते हैं, इसके लिए व्यवस्था करने की आवश्यकता है; का उपयोग करते हुए, जैसा कि आप कहते हैं, एक लूप या कुछ अन्य उपकरण।
आप इसे cp
अकेले नहीं कर सकते, लेकिन आप इसके cp
साथ जोड़ सकते हैं xargs
:
echo dir1 dir2 dir3 | xargs -n 1 cp file1
कॉपी करेंगे file1
करने के लिए dir1
, dir2
और dir3
। ऐसा करने के लिए 3 बार xargs
कॉल करेंगे cp
, xargs
विवरण के लिए मैन पेज देखें।
cp
अकेले नहीं कर सकते हैं" सिर्फ इसलिए कि दूसरे तरीके का सुझाव देकर मददगार बनने का प्रयास किया गया है इसका मतलब यह नहीं है कि प्रश्न का उत्तर नहीं दिया गया था।
echo dir[1-3] | xargs -n 1 cp filename
)।
वाइल्डकार्ड भी रॉबर्ट्स कोड के साथ काम करते हैं
echo ./fs*/* | xargs -n 1 cp test
जहाँ तक मैं इसे देख सकता हूँ आप निम्नलिखित का उपयोग कर सकते हैं:
ls | xargs -n 1 cp -i file.dat
-i
का विकल्प cp
आदेश का मतलब है आप के साथ वर्तमान निर्देशिका में एक फ़ाइल को अधिलेखित करने के लिए है कि क्या कहा जाएगा कि file.dat
। हालांकि यह पूरी तरह से स्वचालित समाधान नहीं है, लेकिन यह मेरे लिए काम करता है।
-i
गार्ड को जोड़ना अच्छा है , क्या यह आपको हर फ़ाइल लिखने के बारे में संकेत नहीं देगा? निर्देशिकाओं की नकल करने के बजाय?
cp: overwrite
सवालों की एक श्रृंखला छापी , लेकिन मुझे उनमें से किसी का भी जवाब नहीं देना पड़ा, और इसने फाइलों को अधिलेखित नहीं किया।
मैं का प्रयोग करेंगे cat
और tee
जवाब मैं में देखा था के आधार पर /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets के बजाय cp
।
उदाहरण के लिए:
cat inputfile | tee outfile1 outfile2 > /dev/null
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
यह भी एक उपयोगी पैटर्न है जैसा कि टेवे के उत्तर द्वारा दिखाया गया है। Io <-redirection के उपयोग को '<' के साथ नोट करें ताकि बिल्ली से पाइपिंग की आवश्यकता न हो।
प्रति sep का उपयोग नहीं कर रहा है, लेकिन ...
यह मेरे लिए एक (धीमी) एसडी कार्ड से तीन (धीमी) यूएसबी ड्राइव से बहुत सारे गोप्रो फुटेज को कॉपी करने के संदर्भ में आया था। मैं केवल एक बार डेटा पढ़ना चाहता था, क्योंकि यह हमेशा के लिए लिया गया था। और मैं इसे पुनरावर्ती चाहता था।
$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )
(और यदि आप अधिक आउटपुट चाहते हैं तो आप उनमे से>> () अनुभाग जोड़ सकते हैं।)
मैंने ऐसा नहीं माना है, लेकिन यह निश्चित रूप से cp-in-a-loop (या समानांतर cp इनवोकेशन का एक गुच्छा) की तुलना में बहुत तेज़ है।
xargs
मैक ओएस पर वाइल्डकार्ड्स का उपयोग करके निर्देशिकाओं के साथ प्रतिलिपि बनाने के लिए, एकमात्र समाधान जो मेरे लिए निर्देशिका नाम के रिक्त स्थान के साथ काम करता है वह है:
find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test
test
कॉपी करने के लिए फाइल कहां है
और ./fs*/*
निर्देशिका को कॉपी करने के लिए
समस्या यह है कि xargs रिक्त स्थान को एक नए तर्क के रूप में देखता है, उपयोग करने वाले सीमांकक चरित्र को बदलने का समाधान -d
या -E
दुर्भाग्य से मैक ओएस पर ठीक से काम नहीं कर रहा है।
मूल रूप से xargs उत्तर के बराबर है, लेकिन यदि आप समानांतर निष्पादन चाहते हैं:
parallel -q cp file1 ::: /foo/ /bar/
इसलिए, उदाहरण के लिए, मौजूदा फ़ोल्डर के सभी उपनिर्देशिकाओं में फ़ाइल 1 को कॉपी करने के लिए (पुनरावृत्ति सहित):
parallel -q cp file1 ::: `find -mindepth 1 -type d`
नायब: यह शायद केवल बहुत विशिष्ट उपयोग के मामलों के लिए कोई ध्यान देने योग्य गति लाभ देता है, जैसे कि यदि प्रत्येक लक्ष्य निर्देशिका एक अलग डिस्क है।
यह कार्यात्मक रूप से xargs के '-P' तर्क के समान है।
नहीं तुम नहीं कर सकते।
मैंने कई अवसरों पर पाया है कि मैं इस कार्यक्षमता का उपयोग कर सकता हूं इसलिए मैंने अपने लिए यह करने के लिए अपना उपकरण बनाया है।
http://github.com/ddavison/branch
बहुत साधारण -
branch myfile dir1 dir2 dir3
/e
उदाहरण के लिए क्लाउड वेब निर्देशिका को माउंट करने का एक तरीका था , बस प्रत्येक मशीन पर एक बार, तो मैं अपने खुद के पावरटूल लिख सकता था और उन्हें हमेशा के लिए रख सकता था।
मान लीजिए कि आप fileName.txt
सभी उप-निर्देशिकाओं को वर्तमान कार्यशील निर्देशिका में कॉपी करना चाहते हैं ।
सभी उप-निर्देशिका नाम प्राप्त करें ls
और उन्हें कुछ अस्थायी फ़ाइल में सहेजें,allFolders.txt
ls > allFolders.txt
सूची को प्रिंट करें और इसे कमांड को पास करें xargs
।
cat allFolders.txt | xargs -n 1 cp fileName.txt
एक अन्य तरीका बिल्ली और टी का उपयोग इस प्रकार है:
cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>
मुझे लगता है कि यह बहुत ही अयोग्य होगा, क्योंकि नौकरी कई प्रक्रियाओं (एक गंतव्य) के बीच विभाजित हो जाएगी और हार्ड ड्राइव थाली के विभिन्न हिस्सों में एक साथ कई फाइलें लिख रहा होगा। हालाँकि, यदि आप कई अलग-अलग ड्राइवों के लिए एक फ़ाइल लिखना चाहते हैं, तो यह विधि संभवतः बहुत ही कुशल होगी (जैसा कि सभी प्रतियां समवर्ती रूप से हो सकती हैं)।
एक बैश स्क्रिप्ट का उपयोग करना
DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6
for (( i=0; i<NumberOfDestinations; i++))
do
cp SourcePath/fileName.ext ${DESTINATIONPATH[$i]}
done
exit
यदि आपके सभी लक्ष्य निर्देशिका पथ अभिव्यक्ति से मेल खाते हैं - जैसे कि वे सभी उपनिर्देशिकाएँ हैं path/to
- तो बस इस तरह से find
संयोजन में उपयोग cp
करें:
find ./path/to/* -type d -exec cp [file name] {} \;
बस।
find
थ्रेड का उपयोग करके हर दूसरे उत्तर के लिए एक डाउन-वोट दिया ।
यदि आपको उस फ़ोल्डर में विशिष्ट होने की आवश्यकता है जिस फ़ाइल को आप एक या एक से अधिक greps के साथ जोड़ सकते हैं। उदाहरण के लिए किसी भी सबफ़ोल्डर में favicon.ico की किसी भी घटना को बदलने के लिए जिसका आप उपयोग कर सकते हैं:
find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico
यह तत्काल उप-निर्देशिकाओं की नकल करेगा, यदि आप गहराई से जाना चाहते हैं, तो -maxdepth
पैरामीटर समायोजित करें ।
find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html
यदि आप सभी निर्देशिकाओं को कॉपी नहीं करना चाहते हैं, तो उम्मीद है कि आप उन निर्देशिकाओं को फ़िल्टर कर सकते हैं जिनमें आप रुचि नहीं रखते हैं। उदाहरण के लिए सभी फ़ोल्डरों को कॉपी करना शुरू होता है। a
find . -mindepth 1 -maxdepth 1 -type d| grep \/a |xargs -n 1 cp -i index.html
यदि आप निर्देशिका के एक मनमाने ढंग से / निराशाजनक सेट की नकल करते हैं तो आपको रॉबर्ट गैम्बल के सुझाव की आवश्यकता होगी।
मैं एक फाइल को कई निर्देशिकाओं में कॉपी करना पसंद करता हूं:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
और एक निर्देशिका को अन्य निर्देशिकाओं में कॉपी करना:
cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
मुझे पता है कि यह कई कमांड जारी करने जैसा है, लेकिन यह मेरे लिए अच्छा है जब मैं 1 लाइन टाइप करना चाहता हूं और थोड़ी देर के लिए चलना चाहता हूं।
उदाहरण के लिए यदि आप अपने गंतव्य फ़ोल्डर की मूल निर्देशिका में हैं, तो आप कर सकते हैं:
i में $ (ls) के लिए; cp sourcefile $ i; किया हुआ
ls
, और हमेशा चर का उद्धरण करें। for i in ./*; do cp sourcefile "$i"; done