如何将 GNU 与 find -exec 并行使用?

How to use GNU parallel with find -exec?

我想解压多个文件,

使用this answer,我找到了以下命令。

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" ""' _ {} \;

如何通过上述命令使用 GNU Parallel 来解压多个文件?


编辑 1: 根据用户 Mark Setchell

的提问

Where are the files ?

所有 zip 文件通常都在一个目录中。

但是,根据我的假设,即使 recursively/non-recursively 根据 find 命令中给出的深度,该命令也会找到所有文件。

How are the files named?

abcd_sdfa_fasfasd_dasd14.zip

how do you normally unzip a single one?

unzip abcd_sdfa_fasfasd_dasd14.zip -d abcd_sdfa_fasfasd_dasd14

您可以先使用 find-print0 选项来以 NULL 分隔文件,然后在 GNU 中与 NULL 分隔符并行读回并应用解压缩

find . -type f -name '*.zip' -print0 | parallel -0 unzip -d {/.} {}

{/.} 部分应用字符串替换来获取文件的基本名称,并从 GNU parallel documentation - See 7. Get basename, and remove last ({.}) or any ({:}) extension 中删除 . 之前的部分您可以进一步设置并行数可以 运行 带有 -j 标志的作业。例如-j8-j64

您也可以使用 -exec+ 变体。它在 find 完成后开始 parallel,但也允许您仍然使用 -print/-printf/-ls/等。并可能在执行命令之前中止查找:

find . -type f -name '*.zip' -ls -exec parallel unzip -d {.} ::: {} \+

请注意,GNU Parallel 还使用 {} 来指定输入参数。但是,在这种情况下,我们使用 {.} 删除扩展名,如您的示例所示。您可以用 -I 覆盖 GNU Parallel 的替换字符串 {}(例如,使用 -I@@ 允许您使用 @@ 而不是 {})。

我建议使用 GNU Parallel 的 --dry-run 标志或在 unzip 前面加上 echo 来先测试命令,看看会执行什么。