使用 xargs 批量转换图像并转换,如何命名输出文件?

使用 xargs 批量转换图像并转换,如何命名输出文件?

众所周知,可以使用以下命令将图像转换为单个 pdf(假设图像文件名顺序正确):

convert *.jpg output.pdf

然而,当涉及数千张图像时,这种方法可能会占用太多 RAM。另一个想法是将图像批量转换为 pdf,然后将生成的 pdf 连接到单个 PDF pdftk

pdftk output-*.pdf cat output output.pdf

到目前为止,我尝试使用以下命令批量转换图像xargs

ls *.jpg | xargs -d $'\n' -t -n 100 bash -c 'convert "$@" output.pdf'

它工作得很好,只是每次convert都会删除以前的 pdf。

问题: 有没有办法统计批次号,并依次生产,例如,,output-1.pdf...,output-9.pdf

答案1

如果你能够换成xargsGNU parallel,那就提供{#}包含正在运行的序列号的替换字符串。

例如给出

$ touch File{001..050}.jpg

然后

$ printf '%s\0' *.jpg | parallel --null -n 5 echo convert {} -o output{#}.pdf
convert File001.jpg File002.jpg File003.jpg File004.jpg File005.jpg -o output1.pdf
convert File006.jpg File007.jpg File008.jpg File009.jpg File010.jpg -o output2.pdf
convert File011.jpg File012.jpg File013.jpg File014.jpg File015.jpg -o output3.pdf
convert File016.jpg File017.jpg File018.jpg File019.jpg File020.jpg -o output4.pdf
convert File021.jpg File022.jpg File023.jpg File024.jpg File025.jpg -o output5.pdf
convert File026.jpg File027.jpg File028.jpg File029.jpg File030.jpg -o output6.pdf
convert File031.jpg File032.jpg File033.jpg File034.jpg File035.jpg -o output7.pdf
convert File036.jpg File037.jpg File038.jpg File039.jpg File040.jpg -o output8.pdf
convert File041.jpg File042.jpg File043.jpg File044.jpg File045.jpg -o output9.pdf
convert File046.jpg File047.jpg File048.jpg File049.jpg File050.jpg -o output10.pdf

答案2

xargs 不提供计算当前实例的方法。您可以ls *.jpg | xargs -d $'\n' -t -n 100 bash -c 'convert "$@" output-$$.pdf'获取不同的名称,但随后您必须根据文件时间戳找出顺序。

一个解决方案是逐步将它们结合起来:

ls *.jpg  |  xargs -d $'\n' -t -n 100 bash -c 'convert "$@" temp.pdf'; if [ -f output.pdf ]; then mv temp.pdf next.pdf; pdftk output.pdf next.pdf cat output temp.pdf; fi; mv temp.pdf output.pdf`

尽管我认为最好的方法是单独转换每个图像:

find -name \*.jpg -exec convert \{\} \{\}.pdf \;
pdftk *.jpg.pdf cat output output.pdf

它更简单,并且在单独的进程上转换每个图像的成本大致相当于让一个转换实例处理 N 个图像。

另外,如果其中一张图像实际上并未订购,则重新排列会更简单,而不必重新转换每个图像,因为现在批次已更改。

相关内容