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

3
我想要做类似的事情。
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,但以下方法不可行:

但我想使用GNU parallel。以下方法不可行:

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

当然,我可以用两个命令(例如使用rename)来完成这个任务,但我想学习如何使用一个命令和GNU parallel来完成。
1个回答

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是指命令字符串后的第二个参数。许多人喜欢使用_,因为该值并不重要。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接