如果我选择一个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脚本更简单的方法?
答案 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,则不需要sed
,awk
等:
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)
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)
cat filename.zip.00* > filename.zip
等待进程结束,这取决于文件大小。
unzip filename.zip