कमांड शेल में फ़ाइल एक्स डुप्लिकेट करें


22

मैं लूप के लिए कमांड लाइन से x के लिए एक वीडियो फ़ाइल को डुप्लिकेट करने की कोशिश करता हूं, मैंने इसे इस तरह आज़माया है, लेकिन यह काम नहीं करता है:

for i in {1..100}; do cp test.ogg echo "test$1.ogg"; done

5
क्या आपकी एकमात्र त्रुटि echoनहीं है जो नहीं होनी चाहिए, और $1जो होनी चाहिए $i?
जूली पेलेटियर

अगर मैं प्रतिध्वनि हटाता हूं और केवल उपयोग करता हूंtest$1.ogg तो यह कहता है: test.ogg और test.ogg एक ही फाइलें हैं , इसलिए ऐसा लगता है कि $ 1 को मान्यता नहीं मिली है?
काला

@EdwardBlack: ऐसा लगता है जैसे मैंने आपकी आवश्यकताओं को गलत तरीके से समझा। वह समाधान उपयुक्त नहीं है।
कोउंगलम

@ जूलीपेल्टियर, लानत है, मेरे साथ कभी-कभी ऐसा होता है कि मैं $1इसके बजाय गलती से लिखता हूं $i, यह सुबह का ईयरली है, क्षमा करें ... धन्यवाद। मैं $xभविष्य में इसके बजाय का उपयोग करेगा$i
काला

जवाबों:


25

आपके शेल कोड में दो मुद्दे हैं:

  1. echoवहाँ नहीं होना चाहिए।
  2. चर $iको $1गंतव्य फ़ाइल नाम के रूप में गलत किया गया है।

फ़ाइल के रूप में एक ही निर्देशिका में फ़ाइल की एक प्रतिलिपि बनाने के लिए, का उपयोग करें

cp thefile thecopy

यदि आप वहाँ कुछ और सम्मिलित करते हैं, उदाहरण के लिए

cp thefile theotherthing thecopy

तो यह माना जाता है कि आप कॉपी करना चाहते हैं thefileऔर theotherthingमें निर्देशिका कहा जाता है thecopy

आपके मामले में, यह विशेष रूप से एक फ़ाइल के लिए दिखता है, जिसे निर्देशिका में कॉपी करने के लिए test.oggनाम दिया echoगया है test$1.ogg

$1सबसे अधिक संभावना एक रिक्त स्ट्रिंग पर विस्तार होगा। यही कारण है, जब आप echoकमांड से हटाते हैं, तो आपको "test.ogg और test.ogg एक ही फाइल हैं"; निष्पादित की जा रही कमांड अनिवार्य रूप से है

cp test.ogg test.ogg

यह शायद एक गलत व्यवहार है।

अंत में, आप कुछ इस तरह चाहते हैं:

for i in {1..100}; do cp test.ogg "test$i.ogg"; done

या, एक विकल्प के रूप में

i=0
while (( i++ < 100 )); do
  cp test.ogg "test$i.ogg"
done

या, का उपयोग कर tee:

tee test{1..100}.ogg <test.ogg >/dev/null

नोट: यह संभवतः 100 प्रतियों के लिए काम करेगा, लेकिन हजारों प्रतियों के लिए यह "तर्क सूची बहुत लंबी" त्रुटि उत्पन्न कर सकता है। उस स्थिति में, लूप का उपयोग करने के लिए वापस लौटें।


12

छोटा और सटीक

< test.ogg tee test{1..100}.ogg

या इससे भी बेहतर है

tee test{1..100}.ogg < test.ogg >/dev/null

अधिक मदद के लिए टी कमांड का उपयोग देखें ।

अद्यतन करें

@Gilles द्वारा सुझाए गए अनुसार, teeकिसी भी फ़ाइल मेटाडेटा को संरक्षित न करने का दोष है। उस समस्या को दूर करने के लिए, आपको उसके बाद कमांड से नीचे भागना पड़ सकता है:

cp --attributes-only --preserve Source Target

3
यह संभावित रूप से कई कॉल्स से अधिक तेज है cp(उपलब्ध मेमोरी के सापेक्ष फ़ाइल आकार पर निर्भर करता है), लेकिन इसमें किसी भी फ़ाइल मेटाडेटा को संरक्षित नहीं करने का दोष है।
गिल्स एसओ- बुराई को रोकें '

@ गिल्स ओह, क्या हम इससे उबर सकते हैं?
राहुल

3
आप cp --attributes-onlyबाद में चला सकते हैं ।
गिल्स एसओ- बुराई को रोकें '

@ धन्यवाद धन्यवाद, आपकी मदद के अनुसार मेरे जवाब को अपडेट किया।
राहुल

एफडब्ल्यूआईडब्ल्यू cp -pमेटाडेटा को संरक्षित करने के लिए उपयोग किए जाने वाले अन्य उत्तरों में से कोई भी नहीं है ।
20


1

फ़ोलोइंग कमांड फ़ाइल को 5 बार कॉपी करेगा :

$ seq 5 | xargs -I AA cp file.a fileAA.a

यदि आप dd पसंद करते हैं (cp के समान नहीं है!):

$ seq 5 | xargs -I AA dd if=file.a of=fileAA.a

0

आपको कॉपी करते समय वेरिएबल i नहीं कहा जाता है

स्क्रिप्ट के नीचे उपयोग करें। परीक्षण के रूप में यह ठीक काम किया

for i in {1..10}; do cp -rvfp test.ogg test$i.ogg ;done

3
यह दो पिछले उत्तरों के समान है और एक टिप्पणी को छोड़कर (1) प्रश्न 100 के बारे में पूछता है, और आपका उत्तर 10 का उपयोग करता है, (2) आपने अनावश्यक रूप से -rvfविकल्प जोड़े हैं cp, और (3) आप अपने चर विस्तार को उद्धृत करने में विफल रहे हैं । (यह भी ध्यान रखें कि विराम चिह्नों ;और निम्न शब्द के बीच एक स्थान होना पारंपरिक है ।) -pविकल्प का जोड़ मूल्यवान है, लेकिन (4a) इसे पहले ही संबोधित किया जा चुका है (टिप्पणियों में), और (4b) आपका उत्तर नहीं है यदि आप स्पष्ट नहीं करते हैं कि आप क्या कर रहे हैं।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.