2011-11-12 253 views
40

如果我選擇一個zip文件並右鍵單擊「解壓縮」,則會創建一個帶有zip文件的文件夾,並將zip文件的全部內容解壓縮到該文件夾​​中。創建zip文件的文件夾並解壓縮到

但是,我想通過shell轉換幾個zip文件。 但是當我做

unzip filename.zip 

的文件夾"filename"沒有創建,但所有的文件解壓縮到當前目錄。

我看過參數,但沒有這樣的參數。 我也試過

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

.zip延伸的2 $ zip文件和4 $ zip文件必須與SED被刪除。 如果我做

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

它不工作。

如何正確替換$zipfile.zip擴展名?

是否有比shell腳本更簡單的方法?

回答

77

unzip file.zip -d xxx將提取文件到目錄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」定義爲FS(字段分隔符)。所以001.zip會被分成兩部分「001」和「」。 $ 1是第一個字段。而$ 0是awk中「001.zip」的整​​行,該字段從1開始計數,而不是0. – Kent

31

「這裏提取」僅僅是您使用的任何unzip包裝的一個特徵。 unzip只會提取存檔中的實際內容。可能沒有比shell腳本更簡單的方法。但是sedawk等不需要這個,如果你有一個兼容POSIX的shell:(你必須擺脫不了*或路徑名擴展不會發生)

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

注意,如果ZIP檔案包含一個目錄,比如Eclipse歸檔文件(它總是包含eclipse/),無論如何你最終都會得到./eclipse*/eclipse/eclipse.ini。在unzip之前添加echo進行空運。

+0

謝謝你的信息。 – jack

+2

@jack,這個答案應該是接受的答案。你不應該使用任何'ls'輸出。 'ls'是交互式查看目錄元數據的工具。用代碼解析'ls'輸出的任何嘗試都被破壞。 Globs更加簡單且正確: '用於* .zip'中的文件。閱讀[Parsing ls](http://mywiki.wooledge.org/ParsingLs) –

6

如果你的p7zip的7ZIP安裝的命令行版本,那麼你可以使用:

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

aunpack從atool會爲各種檔案做到這一點默認。