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
,因为值实际上并不重要。)很好的解释。非常感谢。