2011-11-12 19 views
40

यदि मैं एक ज़िप फ़ाइल चुनता हूं और ज़िप फ़ाइल नाम के साथ एक फ़ोल्डर को "निकालें" पर राइट क्लिक करें और ज़िप फ़ाइल की पूरी सामग्री इसमें निकाली गई है।ज़िप फ़ाइल के लिए फ़ोल्डर बनाएं और इसे निकालें

हालांकि, मैं कई ज़िप फ़ाइलों को खोल के माध्यम से परिवर्तित करना चाहता हूं। लेकिन जब मैं

unzip filename.zip 

करना फ़ोल्डर "filename" बनाया नहीं है, लेकिन सभी फाइलों को वर्तमान निर्देशिका में निकाले जाते हैं।

मैंने पैरामीटर को देखा है लेकिन ऐसा कोई पैरामीटर नहीं है। मैं भी कोशिश की

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done 

लेकिन 2. $ zipfile और 4. $ zipfile की .zip विस्तार एसईडी से हटाया जा करने के लिए है। यदि मैं

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

यह काम नहीं कर रहा है।

$zipfile के .zip एक्सटेंशन को मैं कैसे बदलूं?

क्या शैल स्क्रिप्ट से कोई आसान तरीका है?

उत्तर

77

unzip file.zip -d xxx निर्देशिका xxx पर फ़ाइलों को निकालेगा, और xxx बनाया जाएगा यदि यह वहां नहीं है। आप विवरण के लिए मैन पेज देख सकते हैं।

awk रेखा से नीचे काम करना चाहिए:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh 

परीक्षण नीचे,

टिप्पणी है कि मैं अंत में |sh हटा दिया, के बाद से मेरी ज़िप नकली अभिलेखागार हैं देखें; मैं सिर्फ जेनरेट कमांड लाइन को दिखाना चाहता हूं।

kent$ ls -l 
total 0 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip 

kent$ ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}' 
unzip 001.zip -d 001 
unzip 002.zip -d 002 
unzip 003.zip -d 003 
unzip 004.zip -d 004 
unzip 005.zip -d 005 
unzip 006.zip -d 006 
unzip 007.zip -d 007 
+0

धन्यवाद, एक आकर्षण की तरह काम करता है। – jack

+0

लेकिन मुझे समझ में नहीं आता है कि क्यों $ 0 में पूर्ण फ़ाइल नाम और $ 1 ".zip" एक्सटेंशन नहीं है? – jack

+4

@jack मैंने एफएस (फील्ड सेपरेटर) के रूप में ".zip" परिभाषित किया। तो 001.zip को दो भागों "001" और "" से अलग किया जाएगा। $ 1 पहला क्षेत्र है। और $ 0 पूरी लाइन है जो इस मामले में "001.zip" है, क्षेत्र को 1 से 0, – Kent

31

"यहाँ निकालने" केवल जो कुछ unzip आवरण प्रयोग कर रहे हैं की एक विशेषता है। unzip केवल संग्रह में वास्तव में क्या निकालेगा निकालेंगे। शेल स्क्रिप्ट की तुलना में शायद कोई आसान तरीका नहीं है। लेकिन sed, awk आदि इस के लिए आवश्यक नहीं कर रहे हैं अगर आप एक POSIX शिकायत खोल दिया है: (। आप नहीं * या पथ नाम विस्तार नहीं होगी पलायन करना होगा)

for f in *.zip; do unzip -d "${f%*.zip}" "$f"; done 

ध्यान रखें कि यदि ज़िप संग्रह एक निर्देशिका है, जैसे ग्रहण अभिलेखागार (जिसमें हमेशा eclipse/ होता है), आप किसी भी मामले में ./eclipse*/eclipse/eclipse.ini के साथ समाप्त हो जाएंगे। एक शुष्क रन के लिए unzip से पहले echo जोड़ें।

+0

पढ़ें जानकारी के लिए धन्यवाद। – jack

+2

@jack, यह उत्तर स्वीकार्य उत्तर होना चाहिए। आपको किसी भी चीज़ के लिए 'एलएस' आउटपुट का उपयोग नहीं करना चाहिए। 'ls' निर्देशिका मेटाडेटा को इंटरैक्टिव रूप से देखने के लिए एक उपकरण है। कोड के साथ 'ls' आउटपुट को पार्स करने पर कोई भी प्रयास टूटा हुआ है। ग्लोब बहुत अधिक सरल और सही हैं: * * .zip' में फ़ाइल के लिए। पढ़ें [पार्सिंग एलएस] (http://mywiki.wooledge.org/ParsingLs) –

6

आप p7zip है, तो स्थापित 7Zip के कमांड लाइन संस्करण है, तो आप उपयोग कर सकते हैं:

7z x '*.zip' -o'*' 
1

aunpack atool से अभिलेखागार के सभी प्रकार के लिए डिफ़ॉल्ट रूप से ऐसा करेंगे।

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