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

Bash 在GNU并行命令中执行子进程,bash,parallel-processing,Bash,Parallel Processing,我想做一些像 find ./ -type f | parallel --gnu convert "{}" "$(basename "{}" pdf)jpg" 但它不起作用(文件被重命名为filename.pdfjpg)。我认为问题在于,子流程是立即执行的(甚至在调用parallel之前)。我希望为每个文件执行子流程 感谢你,我能做到: find *.pdf -exec sh -c 'convert "$1" "$(basename "$1" pdf)png"' _ {} \; 但是我想使用g

我想做一些像

find ./ -type f | parallel --gnu convert "{}" "$(basename "{}" pdf)jpg"
但它不起作用(文件被重命名为
filename.pdfjpg
)。我认为问题在于,子流程是立即执行的(甚至在调用
parallel
之前)。我希望为每个文件执行子流程

感谢你,我能做到:

find *.pdf -exec sh -c 'convert "$1" "$(basename "$1" pdf)png"' _ {} \;
但是我想使用
gnupallel
。以下操作不起作用:

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

当然,我可以使用两个命令(例如,使用
重命名
),但我想学习如何使用其中一个命令和
GNU parallel
如果所有文件都具有
.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
实际上是命令字符串之后的第二个参数。许多人喜欢使用
\u
,因为值实际上并不重要。)

很好的解释。非常感谢。