【问题标题】:exclude some pattern in GNU parallel在 GNU 并行中排除某些模式
【发布时间】:2021-10-30 19:17:42
【问题描述】:

我想用并行实现一个目录下的一些文件,

现在我有一些任务,

1,我想跳过一些文件,例如,

parallel -j 16 'zcat {} > {.}.unpacked' ::: *.gz

但为此我想在操作此命令时排除一些具有某种模式的文件。我该如何实现?

2,当操作文件的某些作业出错退出时,如何跳过此状态继续操作其他文件?

【问题讨论】:

    标签: tcsh gnu-parallel


    【解决方案1】:

    您对要排除的内容有点含糊,但说您要处理除以字母 a 开头的所有 gzip 压缩文件:

    find -maxdepth 1 -iname "*.gz" ! -iname "a*" -print0 | parallel -0 'zcat {} > {.}.unpacked'
    

    关于您的第二个问题,GNU Parallel 的默认行为是在出错后继续,因此您无需明确执行任何操作。如果要更改,请查看--halt 选项:

    --halt now,fail=1 当第一个作业失败时退出。杀死正在运行的作业。

    --halt Soon,fail=3 3 个作业失败时退出,但等待正在运行的作业完成。

    --halt Soon,fail=3% exit 当 3% 的作业失败时,等待正在运行的作业完成。

    --halt now,success=1 作业成功时退出。杀死正在运行的作业。

    --halt Soon,success=3 3 个作业成功时退出,但等待正在运行的作业完成。

    --halt now,success=3% 在 3% 的作业成功时退出。杀死正在运行的作业。

    --halt now,done=1 当其中一项作业完成时退出。杀死正在运行的作业。

    --halt Soon,done=3 3 个作业完成后退出,但等待正在运行的作业完成。

    --halt now,done=3% 完成 3% 的工作后退出。杀死正在运行的作业。

    【讨论】:

    • 谢谢!改成这个后,我遇到另一个问题,“并行:错误:输出不完整。无法附加到/proj/0/tmpfiles中的缓冲区文件。磁盘已满吗?”但是我在这个目录中仍然有很多工作区。是否有修复此错误的指南?我已经在命令行中添加了 --tmpdir /proj/0/tmpfiles 和 --compress 。
    • 我不确定那个错误。我会通过为-j 指定一个更小的值来一次尝试更少的进程,看看是否有帮助。否则就错误提出一个新问题 - 问题是免费的。祝你好运。
    • @yewei 在这种情况下你可能不关心输出,所以你可以使用-u,它不会在磁盘上缓冲。
    【解决方案2】:

    如果不想使用find,可以使用skip()

    parallel -j 16 'zcat {= /mypattern/ and skip() =} > {.}.unpacked' ::: *.gz
    

    /mypattern/ 可以是任何 Perl 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多