GNU parallel如何排除指定模式文件及忽略任务错误继续执行
GNU Parallel 常见问题解决方案
问题1:处理.gz文件时排除符合特定模式的文件
提供两种通用实现方式:
- 方式1:使用Shell通配符过滤(适用于Bash/Zsh等支持扩展通配符的Shell)
先开启扩展通配符选项,再用!()语法排除匹配指定模式的文件,以下为排除所有文件名包含ignore的.gz文件的示例:
# 开启Bash扩展通配符 shopt -s extglob parallel -j 16 'zcat {} > {.}.unpacked' ::: !(*ignore*).gz
- 方式2:使用find命令过滤(全Shell通用,支持更复杂的过滤规则)
通过find的! -name参数指定排除规则,配合-print0和parallel的-0参数可兼容含特殊字符的文件名,以下为仅处理当前目录、排除含ignore字符的.gz文件的示例:
find . -maxdepth 1 -type f -name "*.gz" ! -name "*ignore*" -print0 | parallel -0 -j 16 'zcat {} > {.}.unpacked'
问题2:任务执行报错时跳过错误继续处理其他文件
GNU Parallel默认已实现单个任务报错不终止其他未执行任务的逻辑,仅会在所有任务执行完成后返回非零退出码标识存在失败任务。如果需要进一步调整错误处理逻辑,可采用以下方案:
- 显式指定不因为任务错误终止执行:添加
--halt-on-error none参数,明确要求无论有多少任务失败,都跑完所有剩余任务:
parallel -j 16 --halt-on-error none 'zcat {} > {.}.unpacked' ::: *.gz
- 完全忽略单个任务的错误状态:在执行的命令末尾添加
|| true,强制单个任务的退出码始终为0,Parallel会判定所有任务都执行成功:
parallel -j 16 'zcat {} > {.}.unpacked || true' ::: *.gz
内容的提问来源于stack exchange,提问作者yewei
相关产品推荐
相关产品推荐

