【问题标题】:How to use GNU parallel with find -exec?如何将 GNU 与 find -exec 并行使用?
【发布时间】:2020-04-15 11:06:36
【问题描述】:

我要解压多个文件,

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

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

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


编辑 1: 根据用户Mark Setchell

的问题

文件在哪里?

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

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

文件是如何命名的?

abcd_sdfa_fasfasd_dasd14.zip

你通常如何解压缩一个?

unzip abcd_sdfa_fasfasd_dasd14.zip -d abcd_sdfa_fasfasd_dasd14

【问题讨论】:

  • 文件在哪里 - 在单个目录中或分布在目录层次结构中?文件是如何命名的,您通常如何解压缩单个文件?

标签: bash unzip gnu-parallel gnu-findutils


【解决方案1】:

您可以先使用 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 中删除. 之前的部分您可以进一步设置可以使用@ 运行的并行作业的数量987654329@ 标志。例如-j8, -j64

【讨论】:

    【解决方案2】:

    您也可以使用-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 来测试命令,看看会执行什么。

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 2021-07-16
      • 2017-01-25
      • 2021-12-04
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多