【问题标题】:Doing parallel processing in bash?在 bash 中进行并行处理?
【发布时间】:2010-09-28 10:50:45
【问题描述】:

我有数以千计的 png 文件,我喜欢用 pngcrush 将它们缩小。我有一个简单的find .. -exec 工作,但它是连续的。我的机器有很多资源,我会并行处理。

对每个png要执行的操作是:

pngcrush input output && mv output input

理想情况下,我可以指定最大并行操作数。

有没有办法使用 bash 和/或其他 shell 助手来做到这一点?我是 Ubuntu 或 Debian。

【问题讨论】:

    标签: bash parallel-processing


    【解决方案1】:

    您可以使用xargs 并行运行多个进程:

    find /path -print0 | xargs -0 -n 1 -P <nr_procs> sh -c 'pngcrush $1 temp.$$ && mv temp.$$ $1' sh
    

    xargs 将读取 find 生成的文件列表(由 0 个字符分隔 (-0))并一次使用一个参数 (-n 1) 运行提供的命令 (sh -c '...' sh)。 xargs 将并行运行&lt;nr_procs&gt; (-P &lt;nr_procs&gt;)。

    【讨论】:

    • $1 没有被填充,我也尝试了一个没有运气的最小示例。 xargs 是 4.4.0,知道吗?
    • 我忘记指定 $0 的值。现在应该修好了。
    • @BartSas sh -c '...' sh 中的最后一个“sh”是什么意思?谢谢!
    • @Todd 是 $0 的值。你可以传递任何你想要的值。
    【解决方案2】:

    您可以使用自定义 find/xargs 解决方案(请参阅 Bart Sas 的回答),但是当事情变得更加复杂时,您有 - 至少 - 两个强大的选项:

    1. parallel(来自包moreutils
    2. GNU parallel

    【讨论】:

    • Deb 和 RPM 包:build.opensuse.org/package/…
    • 我强烈推荐 GNU 并行而不是 moreutils 版本。它更加灵活。
    • 查找 /path -print0 |并行 -0 pngcrush {} {.}.temp '&&' mv {.}.temp {}
    • @OleTange 这是一个很棒的 sn-p 并且值得自己回答,所以它得到了应有的知名度!
    • @DrewNoakes 显然不值得自己回答:-1 票。哦,好吧。
    【解决方案3】:

    使用 GNU Parallel http://www.gnu.org/software/parallel/ 可以这样做:

    find /path -print0 | parallel -0 pngcrush {} {.}.temp '&&' mv {.}.temp {} 
    

    了解更多:

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2023-03-15
      • 2015-02-13
      • 2017-06-02
      相关资源
      最近更新 更多