为目录中的每个zip文件创建一个专用文件夹并解压缩zip文件

时间:2011-11-12 22:01:46

标签: linux shell sed awk unzip

如果我选择一个zip文件并右键单击“在此处提取”,则会创建一个包含zip文件名的文件夹,并将zip文件的整个内容提取到其中。

但是,我想通过shell转换几个zip文件。 但是当我做的时候

unzip filename.zip

未创建文件夹"filename",但所有文件都被解压缩到当前目录中。

我查看了参数,但没有这样的参数。 我也试过

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

但必须使用sed删除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 

它不起作用。

如何正确替换.zip的{​​{1}}扩展名?

是否有比shell脚本更简单的方法?

7 个答案:

答案 0 :(得分:84)

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

答案 1 :(得分:43)

“在这里提取”只是您正在使用的unzip包装器的一个功能。 unzip只会提取存档中的实际内容。可能没有比shell脚本更简单的方法。但是,如果您有符合POSIX标准的shell,则不需要sedawk等:

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

(你不能逃避*或路径名扩展不会发生。)请注意,如果ZIP存档包含一个目录,例如Eclipse存档(总是包含eclipse/),在任何情况下,你都会得到./eclipse*/eclipse/eclipse.ini。在echo之前添加unzip进行干运行。

答案 2 :(得分:8)

如果你有p7zip,安装了7zip的命令行版本,那么你可以使用:

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

答案 3 :(得分:5)

在切换后添加文件夹名称和斜杠,例如:

unzip -d newfolder/ zipfile.zip

zip将创建文件夹'newfolder'并将存档提取到其中。

请注意,不需要尾部斜杠,但我想这只是旧习惯(我使用Debian和Ubuntu)。

答案 4 :(得分:1)

来自atool的

aunpack默认会对所有类型的档案执行此操作。

答案 5 :(得分:0)

在 Termux bash 中,我最终得到了这个,测试了文件名中的空格和点。它只删除文件夹名称的最后一个文件扩展名和点。这假设 zip 文件具有 .zip 扩展名,否则它将无法工作。在意识到它们只需要作为普通引号出现之前,疯狂地试图\转义引号或使用单引号。在 zip 命令前面放置一个 echo,或者添加一个 -l 来审核命令。出于某种原因,-d 的位置对于这个实现来说似乎很重要。

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

答案 6 :(得分:0)

  1. 打开终端并找到 00* 文件
cat filename.zip.00* > filename.zip

等待进程结束,这取决于文件大小。

  1. 文件加入过程完成,现在您可以运行输出文件
unzip filename.zip