一次解压缩多个文件


27

.zip一个文件夹中有200 多个文件。我不想一一解压。我想使用单个命令或脚本提取那些。怎么做。

Answers:


38

如果您确实想并行解压缩它们,则可以这样做

for i in *zip; do unzip "$i" & done

但是,这将启动N个.zip文件的N个进程,并且可能会对您的系统造成很大的负担。对于更可控制的方法,一次仅启动10个并行进程,请尝试以下操作:

find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

要控制启动的并行进程的数量,请更改-P为所需的值。如果您不想递归到子目录,请执行以下操作:

find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}

或者,您可以按照@OleTange在注释中的建议并行安装GNU并运行

parallel unzip ::: *zip

3
并行运行是一个不错的主意,但是磁盘I / O是否会成为主要瓶颈?
Paddy Landau

1
@PaddyLandau不确定,我必须检查。这将取决于解压缩算法的速度与我想象的磁盘速度。
terdon 2014年

使用-exec-execdir代替管道连接到xargs。它不仅易于理解,而且不易出错,并且使用较少的系统资源。find . -name '*.zip' -exec unzip {} ';'(您必须引用分号。)
Paddy Landau 2014年

@PaddyLandau我将管道传递给xargs的唯一原因是按照OP的要求并行运行事物。-exec \;(您可以转义分号,无需使用引号),将按顺序运行每个命令。-exec +更好,但是在这里不起作用,因为那不是unzip工作原理。
terdon 2014年

我认为我们对OP的理解有所不同。您认为他是并行地想要它,而我理解他是指单个命令而不是多个命令。好吧,他现在有两种方法了:)
Paddy Landau

17

GNU并行命令非常适合于这种类型的事情。后:

$ sudo apt-get install parallel

然后

ls *.zip | parallel unzip

这将使用尽可能多的核心,使每个核心都忙于解压缩,直到完成所有工作。


最好使用它echo *.zip来防止可能的ls别名潜入额外信息。但是,这与@Guru的答案具有相同的问题,它破坏了包含空格的文件名。
nyuszika7h 2014年

1
@ nyuszika7h与xargsGNU 相比,Parallel 在包含空格/制表符/引用的文件名上不会中断。仅当文件名包含换行符时,您才需要格外小心。例如,使用:parallel unzip ::: *.zip
Ole Tange 2014年

@ nyuszika7h-这些是避免标准命令使用别名在文件名中放置空格的充分理由。
韦恩·康拉德2014年

@ nyuszika7h使用echo与using一样糟糕ls。乱跳和一会儿循环是最安全的。
2014年

1
@NateEldredge虽然在系统只有一个磁盘的时候机会更大,但是如今使用具有多个主轴和闪存磁盘的RAID的机会却很小。做的最好的事情是当然的衡量,看看你的系统的行为。我最近使用了40轴RAID,其中I / O饥饿进程的最佳并行度为10:不能提供10倍的加速-仅6倍,但是少于10个进程的速度不到6倍。
Ole Tange 2014年

12

您可以使用以下命令:

首先将终端中的目录更改为包含.zip文件的目录:

cd /path

然后执行以下命令解压缩所有.zip文件:

for z in *.zip; do unzip "$z"; done

10

如果您的.zip文件夹中有很多文件,并且要解压缩所有文件,请打开终端并使用以下命令转到您的文件夹:

cd <path_to_folder>

现在使用此命令解压缩所有.zip文件:

ls *.zip | xargs -n1 unzip

3
如果任何文件名包含空格,将失败。
terdon 2014年

1
是的,你是对的。
g_p 2014年

最好echo *.zip改用它来防止可能的ls别名潜入更多信息,但是仍然不能解决空白问题。
nyuszika7h 2014年

1
@OleTange如果您没有注意到,我说过在带有空格的文件名上它仍然会失败。
nyuszika7h 2014年

1
永远不要依赖来自ls脚本的输出,因为其输出在两个版本之间定义不明确。相反,请查看@terdon的答案,因为它可以解决此解决方案的所有问题。
Paddy Landau


3

非终端方法。

只需选择zip文件,右键单击一个,然后选择extract here。您可以一次选择全部或仅几个zip文件。


1

unzip \*.zip 要么 unzip '*.zip'

显而易见的方法unzip *.zip不起作用,因为外壳将其扩展到第一个文件名unzip foo.zip bar.zip ...并将其unzip解释为zip文件,随后的文件名作为要从该zip文件中提取的文件。

但是,unzip它在Unix命令中有点不同寻常,因为它会自己进行全局扩展。如果*外壳没有展开,则解压缩即可,并将所有结果文件名解释为要处理的zip文件。因此,在这种特殊情况下,一个可以逃脱没有for循环或xargs等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.