हज़ारों फ़ाइलों को कुशलतापूर्वक एक पास में


2

मैं एक हजार फाइल में से एक हजार छोटे फाइलों की सामग्री को एक फ़ाइल में बदलना चाहता हूं। जबकि मैं ऐसा कुछ के साथ कर सकता था for file in $(find . -iname 'pattern'); do; cat $file | gzip - >> zipped.gz; done;, यह पहली बार में बहुत खराब संपीड़न को प्राप्त करता है। हालांकि यह zcat zipped.gz | gzip --best > rezipped.gzकिसी के लिए एक सिंगल पास में करने का एक अच्छा तरीका है, अगर मैं जानना चाहता हूं, तो यह जानना बहुत आसान है ।


क्या यह गज़िप होना है? यहाँ देखें।
केनस्टर

अंतिम लक्ष्य फाइलों की सामग्री के माध्यम से, तेजी से खोज करने में सक्षम होना है। फ़ाइलों को वास्तव में अच्छी तरह से संपीड़ित करते हैं, इसलिए जो बहुत सारी फ़ाइलों पर 2 जीबी से अधिक का एक grep हुआ करता था, अब 14MB से अधिक ज़िपित डेटा का एक grep है, जो बहुत तेज़ है। यह gzip होना जरूरी नहीं है, लेकिन bzip2 के विघटन पर धीमी (afaik) होने के साथ, मुझे लगता है कि यह बेहतर विकल्प है। जब तक bzip के पास किसी अन्य फ़ाइल में सूचीबद्ध सभी फ़ाइलों को संपीड़ित करने का विकल्प नहीं है? यह अच्छा होगा।
निक

जवाबों:


3

जब यह पता चला कि सबसे अच्छा व्यवहार तब है जब आप सभी फाइलों को एक ही स्ट्रीम में कैट करते हैं, तो मैं एक लूप के साथ चीजों का पता लगा रहा था। लेकिन तब मुझे महसूस हुआ कि इसका और भी आसान (और बेहतर) तरीका है:

find . -iname 'pattern' -exec cat {} \; | gzip --best - > file.gz

बिल्ली के सभी इनवॉइस खोज के स्टडआउट पर जाएंगे, वहां केवल एक ही गज़िप का इनवोकेशन होगा। रिजल्ट रिजेक्ट करने से एक ही फाइल साइज मिलता है। अगर आप -exec के + संस्करण (खोज मैन पेज देखें) का उपयोग करते हैं तो आप एक और भी बेहतर परिणाम प्राप्त कर सकते हैं (बिल्ली के इनवोकेशन की संख्या के संदर्भ में नहीं)।


एक विजेता आप हैं! {} + संस्करण मेरी 50k फ़ाइलों के लिए ठीक काम करता है।
निक

1
find . -iname 'pattern' | xargs gzip -9 -v

संपादित करें

ऐसा लगता है कि जब आप फ़ाइल को दबाते हैं तो gzip इसे बेहतर तरीके से ज़िप कर सकता है।

यह काम कर सकता है:

for TXT in $(find /PATH/TO/TXT/FILES -iname '*.txt'); do cat ${TXT} | gzip -9 > ${TXT}.gz; done

मेरे मैक पर, मूल पाठ फ़ाइल को हटाया नहीं गया था। इस प्रकार, मूल पाठ फ़ाइल और ज़िपित फ़ाइल दोनों स्क्रिप्ट चलाने के बाद मौजूद थे।

आप आसानी से जोड़ सकते हैं

rm -f / PAHT / TO / TXT / FILES / $ {TXT}

सादे पाठ फ़ाइलों से छुटकारा पाने के लिए लूप में।


बेशक! मैंने यह कोशिश भी नहीं की है, क्योंकि मुझे नहीं लगता कि यह 50k फाइलों के लिए काम करेगा, लेकिन यह ठीक काम करता है ...
निक

मुझे क्षमा करें, लेकिन यह सर्वोत्तम संभव संपीड़न प्राप्त नहीं करता है। यकीन नहीं है कि क्यों। के बाद find . -iname '*.gtr' | xargs gzip --best -vkc > dazip.gz, ls -la dazip.gzकहते हैं कि यह 19945871 बाइट्स है, और उसके बाद zcat dazip.gz | gzip --best > darezip.gz, darezip सिर्फ 8641529 बाइट्स है, इसलिए 'द' जवाब के रूप में अचिह्नित है, क्षमा करें।
निक

संपादित करने से पहले मुझे लगता है कि आपके पास एक बहुत अच्छा उत्तर था (मैंने उत्तर के रूप में अपना 'चिह्न हटा दिया था, लेकिन उत्थान नहीं!), तो क्या आप उसे वापस ला सकते थे?
निक

मैंने अपनी मूल टिप्पणी छोड़ दी। "EDIT" के नीचे सब कुछ है जो मैंने बाद में जोड़ा।
विंसेंट

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