2011-11-12 264 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会为各种档案做到这一点默认。