在GNU parallel命令中执行一个子进程

9 浏览
0 Comments

在GNU parallel命令中执行一个子进程

我想做类似于以下的操作:

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来实现。

0
0 Comments

问题原因:在使用GNU parallel命令执行子进程时,文件的扩展名不同,需要使用不同的语法来处理。

解决方法:如果所有文件的扩展名都是.pdf,则可以使用GNU parallel的扩展名剥离语法。否则,需要使用bash -c来处理。

文章:

如果所有文件的扩展名都是.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实际上是命令字符串之后的第二个参数。许多人喜欢使用_,因为值并不重要。)

0