मैं दिनांक के क्रम में दी गई निर्देशिका में सभी फ़ाइलों को कैसे सम्‍मिलित कर सकता हूं, जहां मैं शीर्ष पर नवीनतम फ़ाइल चाहता हूं?


18

और नीचे की सबसे पुरानी फ़ाइल के साथ?

इसके अलावा, अगर मैं ऐसा करता हूं, तो क्या प्रत्येक HTML फ़ाइल के भीतर मौजूद अनावश्यक हेडर को बाहर निकालना संभव है? मैं अपने आप को बहुत सारी HTML फ़ाइलों को देख रहा हूं, और अंतिम फ़ाइल के फ़ाइल आकार को थोड़ा कम करना अच्छा होगा।

जवाबों:


33

आपके द्वारा उपयोग की जाने वाली फ़ाइलों को संक्षिप्त करने के लिए

cat file1 file2 file3 ...

समय के अनुसार क्रमबद्ध फ़ाइल नाम की एक सूची प्राप्त करने के लिए, सबसे पहले, आप उपयोग करते हैं

ls -t

यह सब एक साथ डालें,

cat $(ls -t) > outputfile

आप कुछ तर्क देना चाह सकते हैं ls(जैसे,*.html ) ।

लेकिन अगर आपके पास उनमें रिक्त स्थान के साथ फ़ाइल नाम है, तो यह काम नहीं करेगा। My file.htmlमाना जाएगा दो filenames: Myऔर file.html। आप तर्कों को उद्धृत कर सकते हैं ls, और फिर उपयोग कर सकते हैं xargs, जो तर्क को समझने के लिए, तर्कों को पास करने के लिए cat

ls -tQ | xargs cat

आपके दूसरे प्रश्न के लिए, फ़ाइलों के कुछ हिस्सों को फ़िल्टर करना मुश्किल नहीं है, लेकिन यह इस बात पर निर्भर करता है कि आप वास्तव में क्या करना चाहते हैं। "निरर्थक हेडर" क्या हैं?


यह मेरे डेबियन सिस्टम पर काम नहीं कर रहा है ... मुझे उपयोग करना है cat $(ls -t) > outputfile, अन्यथा catउद्धृत फ़ाइल नामों को अस्वीकार करता है
माइक पेनिंगटन

1
मेरी गलती। मैं हमेशा इन चीजों पर फंस जाता हूं। अद्यतन उत्तर देखें।
कोण

ओह - निरर्थक हेडर से मेरा मतलब है कि ऐसी चीजें जो आम तौर पर कुछ शीर्षलेख में डाल दी जाती हैं। php / footer.php फ़ाइल, लेकिन जो HTML से सहेजे जाने पर अलग से सहेजी जाती हैं (और जब आप PHP के पृष्ठों को बड़े पैमाने पर डाउनलोड करते हैं तो फ़ाइल का आकार बढ़ा सकते हैं)।
inquilineKea

cat $(ls -t)फ़ाइल नाम के विस्तार के लिए भी असुरक्षित है। अगर एक ए *, या ?, या एक ब्रैकेट अभिव्यक्ति (जैसे file-[old].html) के साथ एक फ़ाइल नाम है ; और यदि फ़ाइल नाम की व्याख्या अन्य पैटर्न से मेल खाती है; दृष्टिकोण एक गलत सूची का उत्पादन करेगा। set -fइस कमी को दूर करेंगे।
बेयरफुट IO

ls -Qउत्पादन हो सकता है जो के लिए उपयुक्त नहीं है xargs। उदाहरण के लिए, "foo"बन जाता है "\"foo\"", लेकिन xargs समझ नहीं पाता है कि दोहरे उद्धरण दिए गए तार के भीतर दोहरे उद्धरणों से बच गए हैं।
बेयरफुट IO

2

Lexicographic के अलावा अन्य ऑर्डर में फाइलों को सूचीबद्ध करने का सबसे आसान तरीका zsh glob qualifiers है । बिना zsh, आप उपयोग कर सकते हैं ls, लेकिन आउटपुट को पार्स lsकरना खतरों से भरा है

cat *(om)

यदि आप कुछ लाइनें पट्टी करना चाहते हैं, तो sed या awk या perl का उपयोग करें। उदाहरण के लिए, <head>पहली फ़ाइल से लेना और <body>दूसरी फ़ाइलों से भागों को संयोजित करना , यह मानते हुए कि हर फाइल में लाइन पर टैग <body>और </body>टैग अकेले हैं:

{
  sed -e '/<\/body>/ q' *.html(om[2])
  sed -e '1,/<body>/ d' -e '/<\/body>/,$ d' *.html(om[3,-1])
  echo '</body>'
  echo '</html>'
} >concatenated.html

स्पष्टीकरण:

  • सबसे पहले, concatenated.htmlबनाया जाता है। इसलिए यह सबसे युवा है*.html फ़ाइल है (यह मानते हुए कि किसी फ़ाइल की भविष्य में कोई तारीख नहीं है।
  • फिर दूसरी सबसे छोटी *.htmlफ़ाइल से कॉपी करें , लेकिन </body>लाइन पर छोड़ दें ।
  • फिर अन्य फ़ाइलों से कॉपी करें, लेकिन सब कुछ <body>लाइन पर छोड़ दें और लाइन से शुरू करें </body>
  • अंत में अंतिम समापन टैग का उत्पादन करें।

1

@Angus द्वारा दिया गया समाधान अच्छा है, लेकिन समस्या होगी अगर फ़ोल्डर में निर्देशिकाएं हैं जो इसे ठीक कर देंगी।

cat $(ls -tpa | grep -v / )


कैविएट: यह उत्तर पथनाम विस्तार के लिए भी असुरक्षित है, जैसा कि मेरी टिप्पणी में एंगस के उत्तर में बताया गया है।
बेयरफुट IO

जब तक बिल्ली की निकास स्थिति का परीक्षण नहीं किया जाता है, तब तक एक निर्देशिका तर्क असंगत होना चाहिए। बिल्ली बस एक संदेश को stderr पर फेंक देगी और अगले तर्क पर जाएगी।
बेयरफुट IO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.