मैं सूची में प्रत्येक फ़ाइल की सामग्री को किसी अन्य फ़ाइल में कैसे कॉपी करूं?


15

मेरे पास फ़ाइल नाम की फ़ाइल नाम की एक सूची है list_of_files.txt

मैं उस सूची में प्रत्येक फ़ाइल की सामग्री को किसी अन्य फ़ाइल में कॉपी करना चाहता हूं जिसे कहा जाता है all_compounds.sdf

कमांड लाइन से मुझे यह कैसे करना चाहिए?

जवाबों:


20

फ़ाइल नाम प्राप्त करने के लिए सरल कमांड प्रतिस्थापन का उपयोग न करें (जो आसानी से रिक्त स्थान और अन्य विशेष वर्णों के साथ टूट सकता है)। कुछ का उपयोग करें 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)

आसपास के कोष्ठक ()इसे एक उपधारा में चलाने के लिए हैं, ताकि आपके वर्तमान शेल इन परिवर्तनों से प्रभावित न हों।


14

त्वरित और गंदा तरीका ...

cat $(cat list_of_files.txt) >> all_compounds.sdf

कृपया ध्यान दें: यह केवल तभी काम करता है जब आपकी सूची में फ़ाइल नाम बहुत अच्छी तरह से व्यवहार किए जाते हैं - यदि रिक्त स्थान, newlines, या शेल के विशेष अर्थ वाले किसी भी वर्ण में चीजें गलत हो जाएंगी - तो विश्वसनीय परिणामों के बजाय इस उत्तर का उपयोग करें )

टिप्पणियाँ

  • catcon cat फाइलें बजाती है। यह उनकी सामग्री को भी छापता है।
  • कमांड प्रतिस्थापन का उपयोग करके command2 $(command1)आप command1( cat list...) से command2( cat) जो फाइलों को समेटते हैं, का आउटपुट पास कर सकते हैं ।
  • फिर >>आउटपुट को प्रिंट करने के बजाय एक फ़ाइल में भेजने के लिए पुनर्निर्देशन का उपयोग करें । यदि आप आउटपुट देखना चाहते हैं, तो teeइसके बजाय उपयोग करें :

    cat $(cat list_of_files.txt) | tee -a all_compounds.sdf

(मैं का इस्तेमाल किया है >>के बजाय >और teeसाथ -a- इस स्विच मामले में अपनी फ़ाइल पहले से मौजूद संलग्न कर देता है , बजाय उसे ओवरराइट की फाइल करने के लिए अगर यह पहले से मौजूद है)


1
@Zanna आदेश प्रतिस्थापन शब्द बंटवारे से बचने के लिए, की तरह बोली"$(cat list_of_files.txt)"
सर्गी Kolodyazhnyy

4
@ यदि कोई शब्द विभाजन नहीं हुआ है, तो catपूरी सूची को एक तर्क के रूप में प्राप्त करता है।
मुरु

@ एमआरओ ओके, हम उन फिल्नाम से कैसे निपटते हैं जिनमें रिक्त स्थान हैं, फिर?
सेर्गेई कोलोडियाज़नी

1
@Serg सेट के अनुसार IFS - मेरे उत्तर के अंतिम पैराग्राफ को देखें
muru

4

जबकि 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.