उन्हें हटाने के बिना सभी फ़ाइलों को gzip


11

मुझे बाद में मूल को हटाने के बिना उप-निर्देशिका में सभी फ़ाइलों सहित एक डीआईआर में सभी फ़ाइलों को अलग से gzip करने की आवश्यकता है। तो मान लें कि मेरे पास index.html है, मैं अंत index.html.gzip और index.html पर होना चाहता हूं।

मैं के माध्यम से अपने dir में सभी फ़ाइलों को gzip करने में सक्षम हूं

gzip -r .

लेकिन मैं मूल फाइलों को भी रखना चाहता हूं।

क्या यह संभव है?

जवाबों:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

-cStdout के लिए परिणाम धक्का और मूल अकेला रहता है। नुकसान यह है, कि आपको फाइलों को स्वयं खोजने की आवश्यकता है। अधिक परिष्कृत ट्रैवर्सिंग के लिए, आप find(1)हालांकि, ऊपर की तरह उपयोग कर सकते हैं : .वर्तमान निर्देशिका से शुरू होने वाली खोजें, और -type fहर नियमित फ़ाइल का नाम देता है।


क्यों *.*में ls?

@pooh: *.*सभी नियमित रूप से नामित फ़ाइलों से मेल खाता है, और आमतौर पर कोई निर्देशिका नहीं है। बेशक, यह केवल ज्यादातर मामलों में काम करता है और आमतौर पर यदि आपको इसकी आवश्यकता नहीं है। फिर findकमांड का उपयोग करें ।
बोल्डवैन

@ बोल्डवेन: सवाल यह था कि सभी फाइलों को डीआईआर में डाल दिया जाए। TODOls *.* जैसी फाइलें नहीं चुनेंगे

lsकी जरूरत नहीं है सब पर : for x in *। हालांकि, का उपयोग findकरना चाहिए find . -type f | while read -r x
अगली सूचना तक रोक दिया गया।

अद्यतन उत्तर। -rस्विच ऑन करने के लिए धन्यवाद read
बोल्ड्यूवेन

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

-name '*.txt -or -name '*.htmlकुछ फ़ाइलों (पहले से संपीड़ित, बैकअप और अस्थायी फ़ाइलों) को छोड़कर, अब आप इसे आसानी से शामिल करने के लिए इसे बंद कर सकते हैं जैसे कि अब (जैसे)।

फ़ाइल नाम में रिक्त स्थान भी ठीक है।

बदलें gzipकरने के लिए echo gzipपरीक्षण के लिए। या -exec भाग को एक साथ छोड़ दें।

संपादित करें: ओह, मैं यह उल्लेख करना भूल गया कि यह जाँच नहीं करता है कि क्या <target>.gzपहले से मौजूद है। यह समस्या हो सकती है या नहीं भी।

Edit2: ठीक है, यहाँ हम कुछ के साथ जाते हैं जो मौजूदा फ़ाइल के लिए जाँच करता है। अगर वह चाहता हो सकता है। ऑनलाइन-नेस क्षमा करें।

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

My find-foo शायद यह नहीं है कि यह क्या हो सकता है, इसे खोजने में सीधे छोड़ना बहुत संभव हो सकता है।


1
बस पढ़ें कि -नाम से पहले आना चाहिए -प्रत्येक फ़ाइल पर कॉल करने से बचने के लिए।

@ अच्छा समझ में आता है, अच्छा इनपुट! बड़े पेड़ों के लिए यह ध्यान देने योग्य हो सकता है।
प्लांड्रा



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