मेरे पास फ़ाइल नाम की फ़ाइल नाम की एक सूची है list_of_files.txt
।
मैं उस सूची में प्रत्येक फ़ाइल की सामग्री को किसी अन्य फ़ाइल में कॉपी करना चाहता हूं जिसे कहा जाता है all_compounds.sdf
।
कमांड लाइन से मुझे यह कैसे करना चाहिए?
मेरे पास फ़ाइल नाम की फ़ाइल नाम की एक सूची है list_of_files.txt
।
मैं उस सूची में प्रत्येक फ़ाइल की सामग्री को किसी अन्य फ़ाइल में कॉपी करना चाहता हूं जिसे कहा जाता है all_compounds.sdf
।
कमांड लाइन से मुझे यह कैसे करना चाहिए?
जवाबों:
फ़ाइल नाम प्राप्त करने के लिए सरल कमांड प्रतिस्थापन का उपयोग न करें (जो आसानी से रिक्त स्थान और अन्य विशेष वर्णों के साथ टूट सकता है)। कुछ का उपयोग करें xargs
:
xargs -d '\n' -a list_of_files.txt cat > all_compounds.sdf
या एक while read
लूप:
while IFS= read -r file; do cat "$file"; done < list_of_files.txt > all_compounds.sdf
सुरक्षित रूप से कमांड प्रतिस्थापन का उपयोग करने के लिए, कम से कम IFS
केवल नई लाइन पर सेट करें और ग्लोबिंग (वाइल्डकार्ड विस्तार) को अक्षम करें:
(set -f; IFS=$'\n'; cat $(cat list_of_files.txt) > all_compounds.sdf)
आसपास के कोष्ठक ()
इसे एक उपधारा में चलाने के लिए हैं, ताकि आपके वर्तमान शेल इन परिवर्तनों से प्रभावित न हों।
त्वरित और गंदा तरीका ...
cat $(cat list_of_files.txt) >> all_compounds.sdf
कृपया ध्यान दें: यह केवल तभी काम करता है जब आपकी सूची में फ़ाइल नाम बहुत अच्छी तरह से व्यवहार किए जाते हैं - यदि रिक्त स्थान, newlines, या शेल के विशेष अर्थ वाले किसी भी वर्ण में चीजें गलत हो जाएंगी - तो विश्वसनीय परिणामों के बजाय इस उत्तर का उपयोग करें )
cat
con cat फाइलें बजाती है। यह उनकी सामग्री को भी छापता है।command2 $(command1)
आप command1
( cat list...
) से command2
( cat
) जो फाइलों को समेटते हैं, का आउटपुट पास कर सकते हैं ।फिर >>
आउटपुट को प्रिंट करने के बजाय एक फ़ाइल में भेजने के लिए पुनर्निर्देशन का उपयोग करें । यदि आप आउटपुट देखना चाहते हैं, तो tee
इसके बजाय उपयोग करें :
cat $(cat list_of_files.txt) | tee -a all_compounds.sdf
(मैं का इस्तेमाल किया है >>
के बजाय >
और tee
साथ -a
- इस स्विच मामले में अपनी फ़ाइल पहले से मौजूद संलग्न कर देता है , बजाय उसे ओवरराइट की फाइल करने के लिए अगर यह पहले से मौजूद है)
cat
पूरी सूची को एक तर्क के रूप में प्राप्त करता है।
जबकि GNU awk
एक टेक्स्ट प्रोसेसिंग यूटिलिटी है, यह system()
कॉल के माध्यम से बाहरी शेल कमांड चलाने की अनुमति देता है । हम इस तरह से अपने लाभ के लिए उपयोग कर सकते हैं:
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
यहां विचार सरल है: हम फ़ाइल लाइन को लाइन से पढ़ते हैं, और प्रत्येक पंक्ति में से हम स्वरूपित स्ट्रिंग बनाते हैं cat "File name.txt"
, जिसे तब पारित किया जाता है system()
।
और यहाँ यह कार्रवाई में है:
$ ls
file1.txt file2.txt file3 with space.txt file_list.txt
$ awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt
Hi, I'm file2
Hi, I'm file1
Hi, I'm file3
इसलिए हमने वहां पहले से ही कार्य का बड़ा हिस्सा किया है - हमने सूची पर सभी फ़ाइलों को मुद्रित किया है। शेष सरल है: >
ऑपरेटर को सारांश फ़ाइल में फ़ाइल करने के लिए अंतिम आउटपुट को पुनर्निर्देशित करें ।
awk '{cmd=sprintf("cat \"%s\"",$0); system(cmd)}' file_list.txt > output.txt
"$(cat list_of_files.txt)"