如何将 GNU 与 find -exec 并行使用?
Posted
技术标签:
【中文标题】如何将 GNU 与 find -exec 并行使用?【英文标题】:How to use GNU parallel with 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
【问题讨论】:
文件在哪里 - 在单个目录中或分布在目录层次结构中?文件是如何命名的,您通常如何解压缩单个文件? 【参考方案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
来测试命令,看看会执行什么。
【讨论】:
以上是关于如何将 GNU 与 find -exec 并行使用?的主要内容,如果未能解决你的问题,请参考以下文章
使用 GNU sed 和 GNU find 时如何加速替换?
通过将命令行工具包装在带有 gnu 信号量的 bash 脚本中来并行化命令行工具