यह काम क्यों नहीं करता है? “Ls * .txt | xargs cat> all.txt ”(सभी फाइलें एकल txt दस्तावेज़ में)


20

यह काम क्यों नहीं करता है?

ls *.txt | xargs cat > all.txt

(मैं सभी पाठ फ़ाइलों की सामग्री को एक 'all.txt' फ़ाइल में शामिल करना चाहता हूं।) खोज के साथ -exec भी काम करना चाहिए, लेकिन मैं वास्तव में xargs सिंटैक्स को समझना चाहूंगा।

धन्यवाद


1
हालांकि इसके lsलिए उपयोग न करें । यदि आप वास्तव में उपयोग नहीं कर सकते हैं cat *.txt >all.txtतो कोशिश करें printf '%s\0' *.txt | xargs -r0 cat >allऔर फिर mv all all.txtफाइल को स्वयं संदर्भित करने से बचें।
ट्रिपल जूल

जवाबों:


27

ls *.txt | xargs cat >> all.txt

थोड़ा बेहतर काम कर सकते हैं, क्योंकि यह प्रत्येक फ़ाइल के बाद फिर से बनाने के बजाय all.txt के लिए संलग्न होगा।

वैसे, cat *.txt >all.txtकाम भी करेगा। :-)


6
बिल्ली * .txt> all.txt स्वाभाविक रूप से बेहतर है। धन्यवाद
ajo

1
हालाँकि, ... | xargs cat >> all.txt या> all.txt हमेशा xargs के साथ त्रुटि लौटाते हैं: बेजोड़ एकल उद्धरण ... क्या यह है क्योंकि कमांड के बाद xargs सब कुछ लेता है?
अंजो

1
क्या आपके पास रिक्त स्थान के साथ फ़ाइल नाम है? यदि ऐसा है, तो "find / your / path -iname '* .txt' -print0 | xargs -0 cat >> all.txt" के बजाय कुछ का उपयोग करें
Janne Pikkarainen

1
नहीं, मैंने सभी फ़ाइल नाम रिक्त स्थान बदल दिए हैं । लेकिन इसके बारे में सोचते हुए, कुछ फ़ाइलनामों में लिस्टिंग_O'Connor .txt जैसे एकल उद्धरण शामिल होने की संभावना है , यह समस्या हो सकती है!
अंजो

हां, यही समस्या है। :) सबसे आसान और सबसे पवित्र तरीका यह है कि -yr0 को xargs -0 के साथ मिला कर उपयोग करें - फिर पूरी श्रृंखला NULL वर्ण को एक विभाजक और व्हाट्सएप के रूप में उपयोग करेगी और विशेष वर्णों का स्वचालित रूप से ध्यान रखा जाएगा।
Janne Pikkarainen

3

यदि आपकी फ़ाइल के कुछ नाम में ',' या स्पेस विभाजक समस्या केxargs कारण विफल हो जाएगा

सामान्य तौर पर कभी भी xargsबिना -0 न चलाएं क्योंकि यह वापस आ जाएगा और किसी दिन आपको काटेगा।

इसके बजाय GNU समानांतर का उपयोग करने पर विचार करें:

ls *.txt | parallel cat > tmp/all.txt

या यदि आप पसंद करते हैं:

ls *.txt | parallel cat >> tmp/all.txt

जीएनयू समानांतर http://www.youtube.com/watch?v=OpaiGYxkSuQ के बारे में अधिक जानें


1

all.txt एक ही डायरेक्टरी में एक फाइल है, इसलिए जब वह उसी फाइल से उसी फाइल में लिखना चाहता है तो बिल्ली भ्रमित हो जाती है।

दूसरी ओर:

ls *.txt | xargs cat > tmp/all.txt

यह आपके मौजूदा डायरेक्टरी में टेक्सटाइल्स से सबटैक्स में सबटैक्स में पढ़ा जाएगा (इसमें शामिल नहीं है *.txt)।


अभी भी निम्नलिखित त्रुटि: xargs: बेजोड़ एकल उद्धरण; जब तक आप -0 विकल्प का उपयोग नहीं करते हैं, तब तक डिफ़ॉल्ट उद्धरणों के लिए विशेष हैं
ajo

1
क्या आपके पास इसके नाम के एकल टोटेक वाली .txt फाइल है?
जेरेमी स्मिथ

0

तुम भी एक कमांड लाइन लंबाई सीमा के पार आ सकते हैं। उपयोग करने का कारण xargsयह है कि यह इनपुट को सुरक्षित कमांड-लाइन-आकार के विखंडू में विभाजित करता है। तो, ऐसी स्थिति की कल्पना करें जिसमें आपके पास निर्देशिका में सैकड़ों हजारों .txt फाइलें हैं। ls *.txtअसफल हो जायेगी। आपको करने की आवश्यकता होगी

ls | grep .txt$ |xargs cat > /some/other/path/all.txt

.txt$इस मामले में एक रेगुलर एक्सप्रेशन है जो सबकुछ मेल करता है। यह (इसलिए यह बिल्कुल वैसा नहीं है *.txt, क्योंकि अगर आपके पास कोई फाइल है atxt, तो *.txtयह मेल नहीं खाएगा, लेकिन रेगुलर एक्सप्रेशन होगा।)

दूसरे पथ का उपयोग इसलिए है, क्योंकि अन्य उत्तरों ने बताया है, all.txt पैटर्न से मेल खाता है *.txtइसलिए इनपुट और आउटपुट के बीच एक संघर्ष होगा।

ध्यान दें कि यदि आपके पास 'उनके नाम (और यह unmatched single quoteत्रुटि का कारण हो सकता है ) के साथ कोई फ़ाइल है , तो आप करना चाहेंगे

ls | grep --null .txt$ | xargs -0 cat > /some/other/path/all.txt

--Null विकल्प grep को \0डिफ़ॉल्ट न्यूलाइन के बजाय (aka null) चरित्र द्वारा अलग किए गए आउटपुट का उपयोग करने के लिए कहता है , और -0`xargs का विकल्प इसे उसी प्रारूप में इसके इनपुट की अपेक्षा करता है। यह तब भी काम करेगा, जब आपके पास उन में नए नामों के साथ फ़ाइल नाम हों।

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