在GNU parallel命令中执行一个子进程
在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
来实现。
问题原因:在使用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实际上是命令字符串之后的第二个参数。许多人喜欢使用_,因为值并不重要。)