【问题标题】:execute a subprocess in a GNU parallel command在 GNU 并行命令中执行子进程
【发布时间】:2013-08-15 00:44:16
【问题描述】:

我想做类似的事情

find ./ -type f | parallel --gnu convert "{}" "$(basename "{}" pdf)jpg"

但它不起作用(文件被重命名为filename.pdfjpg)。我认为问题在于子进程立即执行(甚至在调用parallel 之前)。我希望为每个文件执行子进程。

感谢find -exec with multiple commands我可以做到:

find *.pdf -exec sh -c 'convert "$1" "$(basename "$1" pdf)png"' _ {} \;

但我想使用GNU parallel。以下方法不起作用:

find ./ -type f | parallel --gnu sh -c 'convert "$1" "$(basename "$1" pdf)jpg"' _ {}

当然,我可以使用两个命令(例如使用rename)来做到这一点,但我想学习如何使用一个命令和GNU parallel 来做到这一点。

【问题讨论】:

    标签: bash parallel-processing


    【解决方案1】:

    如果所有文件都有.pdf 扩展名,您可以使用GNU parallel 的扩展名剥离语法:

    find ./ -type f | parallel --gnu convert {} {.}.jpg
    

    (无需引用 {};parallel 为您完成。)

    否则,你必须使用bash -c

    find ./ -type f | parallel --gnu bash -c 'convert "$1" "${1/%.pdf}.jpg"' bash {}
    

    (第二个bash在那里,因为$1实际上是命令字符串之后的第二个参数。很多人喜欢使用_,因为值并不重要。)

    【讨论】:

    • 很好的解释。谢谢。