2013-02-11 27 views
9

मैं कुछ समय के लिए प्रयास कर रहा हूं और मानता हूं कि मैं इसके काफी करीब हूं, लेकिन मैं यूनिक्स के लिए बिल्कुल नया हूं इसलिए इसे मुश्किल लग रहा है।सभी ज़िप खोजें, और जगह में अनजिप करें - यूनिक्स

मेरे पास एक फ़ोल्डर है, जिसमें कई फ़ोल्डर्स हैं, जिनमें से कुछ में ज़िप फ़ाइलें हैं, कुछ जो नहीं करते हैं। मैं किसी भी उप निर्देशिका में सभी ज़िप फ़ाइलों को अनजिप करने का प्रयास कर रहा हूं।

उदाहरण के लिए मेरे पास है:

फ़ाइलें/ए/something.java

फ़ाइलें/बी/somezipfile.zip

फ़ाइलें/सी/someotherfile.zip

फ़ाइलें/डी/AnotherZipFile.zip

मैं उन्हें अनजिप करना चाहता हूं (लगता है कि ज़िप में केवल .java फाइलें हैं), परिणामस्वरूप: फ़ाइलें/ए/something.ja va

फ़ाइलें/बी/javafile.java

फ़ाइलें/सी/someotherfilefromzip.java

फ़ाइलें/डी/Anotherfile.java

मुझे कोई आपत्ति नहीं है ज़िप फ़ाइलें रहने या कर रहे हैं अनजिप करने के बाद हटा दिया गया, या तो ठीक है।

मैंने अभी तक क्या प्रयास किया है।

find . -name *.zip | unzip 

यह काम नहीं करता:

1) मुझे लगता है मैं पाइपिंग, जो मैं करने के लिए नया हूँ, इस तरह इस्तेमाल कर सकते हैं उम्मीद है।

2) मैं खोज कुछ समय बिताया, निकटतम मैं एक समाधान का उपयोग किया गया ऑनलाइन है:

find . -name '*.zip' -exec unzip '{}' ';' 

इस unzips, लेकिन उन्हें वर्तमान कार्यशील निर्देशिका में unzips, मैं उन्हें जगह में अनज़िप करने के लिए करना चाहता था। मैं इस आदेश को भी समझ नहीं पा रहा हूं जिसे मैं सीखना चाहता हूं।

किसी भी मदद की बहुत सराहना की जाती है।

धन्यवाद,

उत्तर

26
find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';' 

यह वर्तमान निर्देशिका में और रिकर्सिवली *.zip पैटर्न मिलान नाम के साथ फ़ाइलों के लिए उसकी उप-दिखता आदेश देता है। फ़ाइल मिली लिए यह दो मापदंडों के साथ आदेश sh कार्यान्वित:

-c 

और

unzip -d `dirname <filename>` <filename> 

कहाँ <filename> कि पाया गया था फ़ाइल का नाम है। कमांड sh यूनिक्स शैल दुभाषिया है। विकल्प -c खोल बताता है कि अगले तर्क को शैल स्क्रिप्ट के रूप में व्याख्या किया जाना चाहिए।तो खोल निम्न स्क्रिप्ट की व्याख्या:

unzip -d `dirname <filename>` <filename> 

पहले unzip खोल चल आदेश का विस्तार, विभिन्न प्रतिस्थापन करके। इस विशिष्ट उदाहरण में यह आदेश dirname <filename> के उत्पादन में जो वास्तव में निर्देशिका का नाम जहां फ़ाइल रखा गया है आउटपुट के साथ विकल्प

`dirname <filename>` 

। तो, अगर फ़ाइल नाम ./a/b/c/d.zip है, खोल unzip इस तरह रगड़:

unzip -d ./a/b/c ./a/b/c/d.zip 

मामले में आप फ़ाइल नाम या निर्देशिका नाम रिक्त स्थान है ज़िप, इस का उपयोग करें:

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';' 
+0

यह एक अच्छा जवाब जैसा दिखता है, कोई भी मौका जो आप कर सकते हैं (बहुत जल्दी) इसे समझने में मेरी मदद करते हैं? थोड़ा सा मैं इसके बारे में उलझन में हूं- exec और {} अंक की आवश्यकता है। – ThePerson

+1

जोड़ा गया स्पष्टीकरण –

+0

यदि ज़िप फ़ाइल फ़ाइल में कोई स्थान है, तो मुझे कोई समस्या है, क्या इसके लिए कोई आसान समाधान है? – ThePerson

7
find . -name '*.zip' | xargs -n1 unzip 
19

उपयोग -execdir बजाय -exec, जो निर्देशिका में कमांड चलाता है, जहां फ़ाइल मिली है, न कि जिस निर्देशिका से आप find चलाते हैं।

find . -name '*.zip' -execdir unzip '{}' ';' 
+0

fantastically काम किया। क्या आप यह समझते हैं कि '{}' क्या करता है (प्लेसहोल्डर फ़ाइल नाम?) और क्यों ''; 'को अलग उद्धरण होना चाहिए? धन्यवाद! –

+0

{} का अर्थ है कि वर्तमान फ़ाइल जिस पर आप काम कर रहे हैं – Tebe

संबंधित मुद्दे