मैंने पहले यहां शर्मनाक दौर के बारे में जवाब दिया था, लेकिन डेनिस के जवाब ने मुझे याद दिलाया कि मैं सबसे बुनियादी चीज से चूक गया था। इसलिए, मैंने अपना मूल उत्तर हटा दिया। लेकिन चूंकि कोई भी नहीं है ने कहा कि यह बहुत ही बुनियादी बात है, मैं इसे के मूल्य इसे यहाँ डालने लगता है।
मूल प्रश्न यह है कि "मेरे पास अंतरिक्ष की अलग-अलग नामों की सूची वाली एक पाठ फ़ाइल है। मैं उन लोगों को एक लक्ष्य निर्देशिका में कैसे कॉपी कर सकता हूं।" पहले तो यह मुश्किल या जटिल लग सकता है, क्योंकि आपको लगता है कि आपको किसी तरह से किसी विशिष्ट तरीके से फ़ाइल से आइटम निकालना होगा। हालांकि, जब शेल एक कमांड लाइन को संसाधित करता है, तो पहली चीज जो करता है वह तर्क सूची को टोकन में अलग कर देता है और (यहां बिट कोई भी एकमुश्त नहीं कहा है) रिक्त स्थान को अलग करता है । (न्यूलाइन्स ने टोकन को भी अलग कर दिया है यही वजह है कि डॉग हैरिस की एक अलग सूची के साथ परीक्षण का एक ही परिणाम था।) यही है, शेल उम्मीद करता है और पहले से ही एक अंतरिक्ष-पृथक सूची को संभाल सकता है।
इसलिए आपको यहां बस इतना करना है कि आपके कमांड में सही जगह पर स्पेस-सेपरेटेड लिस्ट (जो आपके पास पहले से है) डाल दी जाए। आपकी आज्ञा इस पर कुछ भिन्नता है:
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
को मानक इनपुट की सामग्री को डंप करने के लिए कहता है । चूंकि $()
बिट पहले संसाधित हो जाता है, यहां चरणों में क्या होता है:
cp $(<list.txt) new_folder
# split line into three tokens: cp, $(<list.txt), new_folder
cp file1 file2 file3...file# new_folder
# substitute result of $(<list.txt) into the larger command
स्पष्ट रूप से चरण 2 बस सामान्य cp
आदेश है जिसे आप चाहते थे।
मुझे पता है कि मैं इसे (शायद बहुत मरा) घोड़े को बहुत मार रहा हूं, लेकिन मुझे लगता है कि यह करने लायक है। यह समझना कि शेल कैसे एक कमांड को संसाधित करता है, आपको इसे बेहतर लिखने और बहुत सरल बनाने में मदद कर सकता है। यह आपको यह भी दिखाएगा कि समस्याओं को छिपाने की संभावना कहां है। इस मामले में, उदाहरण के लिए, आपके लिए मेरा पहला सवाल मज़ाकिया फ़ाइलनाम या संभावित टाइपो के बारे में होना चाहिए था। कोई कलाबाजी आवश्यक नहीं थी।