在GNU并行命令中执行子进程

时间:2013-08-15 00:44:16

标签: bash parallel-processing

我想做点什么

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进行操作。

1 个答案:

答案 0 :(得分:4)

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

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

(无需引用{};并行为您做。)

否则,您必须使用bash -c

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

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