Answers:
如果您确实想并行解压缩它们,则可以这样做
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
-exec
或-execdir
代替管道连接到xargs
。它不仅易于理解,而且不易出错,并且使用较少的系统资源。find . -name '*.zip' -exec unzip {} ';'
(您必须引用分号。)
-exec \;
(您可以转义分号,无需使用引号),将按顺序运行每个命令。-exec +
更好,但是在这里不起作用,因为那不是unzip
工作原理。
的GNU并行命令非常适合于这种类型的事情。后:
$ sudo apt-get install parallel
然后
ls *.zip | parallel unzip
这将使用尽可能多的核心,使每个核心都忙于解压缩,直到完成所有工作。
echo *.zip
来防止可能的ls别名潜入额外信息。但是,这与@Guru的答案具有相同的问题,它破坏了包含空格的文件名。
xargs
GNU 相比,Parallel 在包含空格/制表符/引用的文件名上不会中断。仅当文件名包含换行符时,您才需要格外小心。例如,使用:parallel unzip ::: *.zip
echo
与using一样糟糕ls
。乱跳和一会儿循环是最安全的。
如果您的.zip
文件夹中有很多文件,并且要解压缩所有文件,请打开终端并使用以下命令转到您的文件夹:
cd <path_to_folder>
现在使用此命令解压缩所有.zip
文件:
ls *.zip | xargs -n1 unzip
echo *.zip
改用它来防止可能的ls
别名潜入更多信息,但是仍然不能解决空白问题。
ls
脚本的输出,因为其输出在两个版本之间定义不明确。相反,请查看@terdon的答案,因为它可以解决此解决方案的所有问题。
您可以-exec
像这样使用find ,
find . -name "*.zip" -exec unzip {} \;
如果文件名称中有空格,这将起作用。