2012-04-28 8 views
17

में सभी उप-निर्देशिकाओं में सभी फ़ाइलों को gzip करने के लिए कैसे मैं अपने वर्तमान स्थान की उप निर्देशिकाओं में पुनरावृत्ति करना चाहता हूं और प्रत्येक फ़ाइल को अलग-अलग gzip करना चाहता हूं। एक निर्देशिका में फ़ाइलों को ज़िप करने के लिए, मैंबैश

for file in *; do gzip "$file"; done 

उपयोग करते हैं लेकिन यह सिर्फ वर्तमान निर्देशिका और वर्तमान निर्देशिका का नहीं उप निर्देशिकाओं पर काम कर सकते हैं। मैं उपर्युक्त कथन कैसे लिख सकता हूं ताकि यह सभी उपनिर्देशिकाओं में फ़ाइलों को भी ज़िपित कर सके?

उत्तर

41

छोरों या कुछ भी करने के लिए कोई ज़रूरत नहीं एक से अधिक find और gzip:

find . -type f ! -name '*.gz' -exec gzip "{}" \; 

इस में और वर्तमान निर्देशिका जिनके नाम .gz विस्तार के साथ समाप्त नहीं नीचे सभी नियमित फ़ाइलें पाता है (जो है , सभी फाइलें जो पहले ही संपीड़ित नहीं हैं)। यह व्यक्तिगत रूप से प्रत्येक फ़ाइल पर gzip का आह्वान करता है।


संपादित करें, user unknown से टिप्पणी के आधार पर:

घुंघराले ब्रेसिज़ ({}) -exec निम्नलिखित के रूप में आप देख सकते हैं फ़ाइल नाम, जो सीधे पारित हो जाता है एक शब्द के रूप में, आदेश के लिए, बदल दिए जाते हैं यहाँ:

$ touch foo 
$ touch "bar baz" 
$ touch xyzzy 
$ find . -exec echo {} \; 

./foo 
./bar baz 
./xyzzy 
+2

आपकी आखिरी वाक्य एक आम गलत जानकारी है। पता लगाएं कि एक फ़ाइल नाम कहां से शुरू होता है और यह कहां समाप्त होता है। खुद, इसमें रिक्त स्थान या लाइनब्रेक और अन्य मजेदार चीजों के साथ कोई समस्या नहीं है। तो '-exec gzip {}' एक फ़ाइल नाम के साथ gzip को कॉल करता है, और चूंकि कोई मध्यवर्ती खोल नहीं लगाया जाता है, जो डिलीमीटर के रूप में रिक्त स्थान की व्याख्या कर सकता है, gzip पूरे फ़ाइल नाम प्राप्त करेगा। खोज के मैनपेज में संकेत पुराना लगता है और इसका मतलब है: आपका खोल खोजने के लिए इसे पार करने से पहले {} को समझने का प्रयास कर सकता है, लेकिन ऐसा कोई खोल नहीं देखा गया है [वर्षों से] (http://unix.stackexchange.com/q/ 8647/4485)। –

+1

आप हर दिन कुछ नया सीखते हैं। पाठ के लिए धन्यवाद! * .gz फ़ाइलों को बाहर करने के लिए –

+2

+1 – GuruM

5
find . -type f | while read file; do gzip "$file"; done 
+1

क्या होगा यदि फ़ाइल में रिक्त स्थान या अन्य विशेष वर्ण हैं? जो 'के लिए' के ​​साथ काम नहीं करेगा – c00kiemon5ter

+1

@ c00kiemon5ter क्या कोई जवाब काम करता है, लेकिन अपूर्ण हो सकता है कि वह डाउनवोट के लायक हो? एसओ के अनुसार "जब भी आप एक गंभीर रूप से मैला, कोई प्रयास नहीं किया गया पोस्ट, या एक उत्तर जो स्पष्ट रूप से और शायद खतरनाक रूप से गलत है, तो अपने डाउनवॉट्स का उपयोग करें।" यह जवाब उन चीजों में से कोई नहीं है। अधूरा, कुछ हद तक मैला, लेकिन गलत नहीं है। आपको शायद ऊपर की प्रक्रिया को अपना टोल लेना चाहिए और एक टिप्पणी छोड़ दी जानी चाहिए। –

+0

आईएमओ, जवाब गलत है। फरशीद ने कभी निर्दिष्ट नहीं किया कि फाइलों में कोई विशेष वर्ण नहीं है, इसलिए आपका उत्तर केवल प्रश्न के एक विशेष मामले का उत्तर देता है। आप 'ढूंढें .. | का उपयोग करने के बेहतर हैं जबकि पढ़ा ..'। अपना जवाब सही करें और मैं ऊपर उठाने वाला पहला व्यक्ति होगा। लेकिन मुझे गलत (आईएमओ) उत्तरों को बढ़ावा देने के लिए मत कहो। – c00kiemon5ter

11

मैं gzip -r ./ जो एक ही बात करता है लेकिन कम है पसंद करेंगे।