फाइलों की सूची कॉपी करें


35

मेरे पास एक फ़ाइल में रिक्त स्थान द्वारा अलग की गई फ़ाइलों की एक सूची है list.txt। मैं उन्हें एक नए फ़ोल्डर में कॉपी करना चाहूंगा।

मैंने करने की कोशिश की:

cp `cat list.txt` new_folder

लेकिन यह काम नहीं करता।

आप यह कैसे करेंगे ?

अद्यतन करें:

आपके सभी बहुत ही दिलचस्प जवाब के लिए धन्यवाद। मैंने इतना नहीं मांगा :)

दूसरी बार से ऊपर के समाधान की कोशिश करने के बाद, ऐसा लगता है कि cpउपयोग सहायता मुद्रित किया गया क्योंकि फ़ोल्डर new_folderअभी तक मौजूद नहीं था! क्षमा करें, यह एक मूर्खतापूर्ण गलती प्रतीत होती है ... जब मैं पहले फ़ोल्डर बनाता हूं, तो यह काम करता है।

हालाँकि, मैंने आपके सभी उत्तरों और समाधानों से बहुत कुछ सीखा है, उन्हें लिखने के लिए समय निकालने के लिए धन्यवाद।


मुझे एक बात स्पष्ट करने दें: सूची में एक लाइन में सभी फ़ाइल नाम हैं, केवल एक स्थान द्वारा अलग किया गया है? या प्रत्येक एक अलग लाइन पर नाम हैं?
टेलीमेकस

सभी एक चूने में, एक स्थान से अलग हो गए। डौग का समाधान काम किया :) उत्तर के लिए धन्यवाद।
क्लॉस

यह मजेदार है ... मैंने अपने समाधान को एक पंक्ति के साथ परीक्षण किया जिसमें प्रत्येक नाम एक अलग लाइन पर था।
डग हैरिस

"यह काम नहीं किया" बहुत सार्थक नहीं है। वास्तव में यह कैसे काम नहीं किया। यह मेरे लिए ठीक काम करता है।
अगली सूचना तक रोक दिया गया।

क्षमा करें: इसमें cp उपयोग सहायता दिखाई गई। ऊपर मेरा अपडेट देखें।
क्लॉस

जवाबों:


34

Xargs का उपयोग करके देखें:

cat list.txt | xargs -J % cp % new_folder

अद्यतन करें:

मैंने इसे ओएस एक्स पर किया था जिसमें जीएनयू / लिनक्स संस्करणों की तुलना में एक अलग संस्करण है। xargsजो से आता है जीएनयू findutils नहीं है -J, लेकिन यह है -Iजो इसी तरह की है (जैसा कि डेनिस विलियमसन ने एक टिप्पणी में कहा)। Xargs के OS X संस्करण में दोनों हैं -Iऔर -Jजिनमें थोड़ा अलग व्यवहार है - या तो इस मूल प्रश्न के लिए काम करेंगे।

$ cat list.txt
one
two.txt
three.rtf

$ cat list.txt | xargs -J % echo cp % new_folder
cp one two.txt three.rtf new_folder

$ cat list.txt | xargs -I % echo cp % new_folder
cp one new_folder
cp two.txt new_folder
cp three.rtf new_folder

3
मेरे xargsपास -Jयह नहीं है -Iजो ऐसा ही करता है। आपके पास क्या संस्करण xargsऔर क्या OS / वितरण है?
अगली सूचना तक रोक दिया गया।

मैंने मैक ओएस एक्स 10.6 (उर्फ स्नो लेपर्ड) पर यह परीक्षण किया है, इसलिए यह ओएस के साथ xargs जहाजों का जो भी संस्करण है। रनिंग xargs --versionएक उपयोग त्रुटि संदेश देता है। यह xargs का BSD संस्करण होने की संभावना है। का उपयोग -Iऔर -Jसूक्ष्म रूप से अलग हैं। मैं अच्छी तरह से स्वरूपित उदाहरणों के साथ अपने उत्तर को अपडेट करूंगा।
डग हैरिस

हां, मैं मैक OSX 10.6 के साथ काम कर रहा हूं। -J-I
क्लाउस

इससे पहले कि आप उन्हें चलाने से पहले अपने आदेशों की जांच करने के लिए प्रतिध्वनि का उपयोग करने के लिए एक अच्छा टिप है।
लियाम

1
केवल आवश्यक परिवर्तनों के साथ समान उपर्युक्त आदेश का उपयोग करना, मैं फ़ाइलों को उनकी निर्देशिकाओं और उप-विभाजनों को बनाने के साथ-साथ उनकी प्रतिलिपि कैसे बना सकता हूं, जिन्हें स्लैश द्वारा अलग किया गया है?
विक्की देव

54

इसकी कोई आवश्यकता नहीं cat:

xargs -a list.txt cp -t new_folder

या लंबे विकल्पों का उपयोग कर:

xargs --arg-file=list.txt cp --target-directory=new_folder

यहाँ कुछ शेल संस्करण हैं। ध्यान दें कि कुछ चर अयोग्य हैं या forलूप विशेष रूप से उपयोग किए जाते हैं क्योंकि ओपी निर्दिष्ट करता है कि फ़ाइल नाम अंतरिक्ष सीमांकित हैं। इन तकनीकों में से कुछ फ़ाइल नाम-प्रति-पंक्ति इनपुट के लिए काम नहीं करेंगी जिसमें फ़ाइलनाम में सफेद स्थान होता है।

दे घुमा के:

for file in $(<list.txt); do cp "$file" new_folder; done

या

cp $(<list.txt) new_folder

श (या बैश):

# still no cat!
while read -r line; do for file in $line; do cp "$file" new_folder; done; done < list.txt

या

# none here either
while read -r line; do cp $line new_folder; done < list.txt

या

# meow
for file in $(cat list.txt); do cp "$file" new_folder; done

या

# meow
cp $(cat list.txt) new_folder

noob सवाल: में क्यों -tआवश्यक है xargs -a list.txt cp -t new_folder?
यिबो यांग

1
@YiboYang: -tका एक विकल्प है cp। यह सभी स्रोत तर्कों को निर्दिष्ट लक्ष्य निर्देशिका में कॉपी करता है। यहां, यह लक्ष्य को उस स्रोत से पहले निर्दिष्ट करने की अनुमति देता है जिसे xargsकमांड द्वारा जोड़ा जाता है ।
अगली सूचना तक रोक दिया गया।

यह उपयोगी है लेकिन क्या होगा यदि list.txt में मिश्रित फ़ाइलें और फ़ोल्डर्स पथ हैं? उस स्थिति में कमांड ठीक से काम नहीं करता है। यह "ऑउटिंग डाइरेक्टरी ..." रिपोर्ट करता है और यदि -R cp कमांड के लिए निर्दिष्ट किया जाता है, तो लिस्ट में पहली फाइल के सामने आते ही "एक डाइरेक्टरी नहीं है" त्रुटि की सूचना दी जाती है।
बेमिपफे

7

मैंने पहले यहां शर्मनाक दौर के बारे में जवाब दिया था, लेकिन डेनिस के जवाब ने मुझे याद दिलाया कि मैं सबसे बुनियादी चीज से चूक गया था। इसलिए, मैंने अपना मूल उत्तर हटा दिया। लेकिन चूंकि कोई भी नहीं है ने कहा कि यह बहुत ही बुनियादी बात है, मैं इसे के मूल्य इसे यहाँ डालने लगता है।

मूल प्रश्न यह है कि "मेरे पास अंतरिक्ष की अलग-अलग नामों की सूची वाली एक पाठ फ़ाइल है। मैं उन लोगों को एक लक्ष्य निर्देशिका में कैसे कॉपी कर सकता हूं।" पहले तो यह मुश्किल या जटिल लग सकता है, क्योंकि आपको लगता है कि आपको किसी तरह से किसी विशिष्ट तरीके से फ़ाइल से आइटम निकालना होगा। हालांकि, जब शेल एक कमांड लाइन को संसाधित करता है, तो पहली चीज जो करता है वह तर्क सूची को टोकन में अलग कर देता है और (यहां बिट कोई भी एकमुश्त नहीं कहा है) रिक्त स्थान को अलग करता है । (न्यूलाइन्स ने टोकन को भी अलग कर दिया है यही वजह है कि डॉग हैरिस की एक अलग सूची के साथ परीक्षण का एक ही परिणाम था।) यही है, शेल उम्मीद करता है और पहले से ही एक अंतरिक्ष-पृथक सूची को संभाल सकता है।

इसलिए आपको यहां बस इतना करना है कि आपके कमांड में सही जगह पर स्पेस-सेपरेटेड लिस्ट (जो आपके पास पहले से है) डाल दी जाए। आपकी आज्ञा इस पर कुछ भिन्नता है:

cp file1 file2 file3...file# target

एकमात्र शिकन यह है कि आप अपनी पाठ फ़ाइल से # 1 के माध्यम से फ़ाइलों की सूची प्राप्त करना चाहते हैं।

जैसा कि डेनिस अपनी टिप्पणी में बताते हैं, आपके मूल प्रयास ( cpकैट लिस्ट.टैक्स new_folder) को पहले से ही काम करना चाहिए था। क्यूं कर? क्योंकि आंतरिक कमांड cat list.txtको पहले शेल द्वारा संसाधित किया जाता है और इसमें विस्तार होता है file1 file2 file3...file#, यही वह है जो शेल की अपेक्षा करता है और कमांड के उस भाग पर चाहता है। यदि यह काम नहीं करता था, तो या तो (1) आपके पास टाइपो था या (2) आपके फ़ाइलनाम किसी तरह से अजीब थे (उनके पास स्थान या अन्य असामान्य वर्ण थे)।

कारण यह है कि सभी डेनिस के जवाब काम बस इतना है कि वे cpकाम करने के लिए फ़ाइलों की आवश्यक सूची प्रदान करते हैं , उस सूची को रखकर जहां यह पूरी कमांड में है। फिर, कमांड ही संरचना में यह है:

cp list-of-files target_directory

यह देखना आसान है कि यह सब इस संस्करण में एक साथ कैसे आता है:

cp $(<list.txt) new_folder

$()कोष्ठक के अंदर कमांड को चलाने के लिए शेल का कारण बनता है और फिर उस बिंदु पर इसके उत्पादन को बड़ी लाइन में प्रतिस्थापित करता है। फिर शेल पूरे के रूप में लाइन चलाता है। वैसे, $()आप पहले से ही बैकटिक्स (`) के साथ जो कर रहे थे उसका एक और अधिक आधुनिक संस्करण है। अगला: <एक फ़ाइल पुनर्निर्देशन ऑपरेटर है। यह शेल list.txtको मानक इनपुट की सामग्री को डंप करने के लिए कहता है । चूंकि $()बिट पहले संसाधित हो जाता है, यहां चरणों में क्या होता है:

  1. cp $(<list.txt) new_folder # split line into three tokens: cp, $(<list.txt), new_folder
  2. cp file1 file2 file3...file# new_folder # substitute result of $(<list.txt) into the larger command

स्पष्ट रूप से चरण 2 बस सामान्य cpआदेश है जिसे आप चाहते थे।

मुझे पता है कि मैं इसे (शायद बहुत मरा) घोड़े को बहुत मार रहा हूं, लेकिन मुझे लगता है कि यह करने लायक है। यह समझना कि शेल कैसे एक कमांड को संसाधित करता है, आपको इसे बेहतर लिखने और बहुत सरल बनाने में मदद कर सकता है। यह आपको यह भी दिखाएगा कि समस्याओं को छिपाने की संभावना कहां है। इस मामले में, उदाहरण के लिए, आपके लिए मेरा पहला सवाल मज़ाकिया फ़ाइलनाम या संभावित टाइपो के बारे में होना चाहिए था। कोई कलाबाजी आवश्यक नहीं थी।


@ क्लॉस आपका बहुत स्वागत है। फ्रैंक होने के लिए, मुझे डेनिस के जवाब को पढ़ने और मुझे एहसास होने के बाद कि मैं समस्या का मुख्य हिस्सा पूरी तरह से याद कर रहा हूं, मैं ज्यादातर खुद पर नाराज था। आपको जो समाधान पसंद है वह वहीं से है।
टेलीमैचस

यह एक सुपर पुराना उत्तर है, लेकिन यदि आपको फ़ोल्डर संरचना को फिर से बनाने की आवश्यकता है, तो आपको --parentsध्वज की आवश्यकता है । आप इसे -vकॉपी किए गए के रिकॉर्ड के साथ क्रिया कर सकते हैं । यदि आप अनुमतियाँ रखना चाहते हैं, तो आपको -aया -pध्वज की आवश्यकता है । यानी, cp --parents -av $(<list.txt) new_folder। यह सब मान रहा है कि आपकी फ़ाइलों की सूची वास्तव में सभी फाइलें हैं, अन्यथा आपको -rपुनरावृत्ति के लिए भी ध्वज की आवश्यकता हो सकती है ।
धापिन

@ दाउपिन वास्तव में, ओपी बताता है कि वह macOS पर था। तो क्या यह मूल्य के लिए है, --parentsझंडा वहाँ मौजूद नहीं है। उनका (बीएसडी-व्युत्पन्न) संस्करण cpकेवल लघु विकल्प प्रदान करता है, जीएनयू-शैली लंबे विकल्प नहीं। बीएसडी-शैली के लिए cp, पुनरावर्ती प्रतिलिपि के लिए झंडा अपरकेस है -R, न कि लोअरकेस।
टेलीमेकस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.