Pra*_*are 62 command-line imagemagick wildcards conversion
我想将一些文件从 jpeg 转换为 pdf。我正在使用以下命令。
$ convert image1.jpg image1.pdf
Run Code Online (Sandbox Code Playgroud)
但我有 100 张图片。我应该如何将它们全部转换为相应的 pdf?
我试过
$ convert image*.jpg image*.pdf
Run Code Online (Sandbox Code Playgroud)
它不起作用。
enz*_*tib 73
在 bash 中:
for f in *.jpg; do
convert ./"$f" ./"${f%.jpg}.pdf"
done
Run Code Online (Sandbox Code Playgroud)
cjm*_*cjm 66
您可以mogrify
为此使用该命令。通常,它会就地修改文件,但在转换格式时,它会写入一个新文件(只需更改扩展名以匹配新格式)。因此:
mogrify -format pdf -- *.jpg
Run Code Online (Sandbox Code Playgroud)
(与 enzotib 的 一样./*.jpg
,它--
可以防止任何奇怪的文件名被解释为开关。大多数命令都识别--
为“此时停止寻找选项”。)
Seb*_*ian 26
更快但不寻常的语法:
parallel convert '{} {.}.pdf' ::: *.jpg
Run Code Online (Sandbox Code Playgroud)
并行运行(使用https://www.gnu.org/software/parallel/)。我还没有注意到任何多线程convert
,这会限制有效的并行化。如果这是您的担忧,请参阅下面的评论以获取确保不发生多线程的方法。
Rob*_*ing 23
https://gitlab.mister-muffin.de/josch/img2pdf
在所有涉及 ImageMagick 的建议解决方案中,JPEG 数据都被完全解码和重新编码。这会导致代损失,以及性能比img2pdf
.
自 Debian 9 (stretch) 起在 Debian 中可用,自 16.04 (xenial) 起在 Ubuntu 中可用。也可以安装,pip img2pdf
前提是您有依赖项(例如apt-get install python python-pil python-setuptools libjpeg-dev
或yum install python python-pillow python-setuptools
)。
acu*_*ich 13
这是一种将上述建议的最佳组合成一个简单、高效、健壮的命令行的方法:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Run Code Online (Sandbox Code Playgroud)
它适用于以 a-
或包含空格开头的文件名。请注意-iname
which的使用是不区分大小写的版本,-name
因此它将.JPG
与.jpg
.
这用于find
获取文件列表,而不是使用*.jpg
通配符进行 shell通配,这可能会在某些系统上导致“参数列表太长”错误。尽管@enzotib 在评论中指出,在 for 循环中使用globbing 的行为与命令的 arguments 不同。
此外,find
将处理子目录,而 shell globbing 不会,除非您碰巧具有特定于 shell 的功能,例如**/*jpg
zsh 中的递归 globbing 语法。
编辑:我想我会find
在阅读@IlmariKaronen关于重新运行命令并只转换自第一次运行后更改的文件的评论后想到的另一个有用的功能。
在第一次通过时,您可以touch
在转换完成后获得时间戳文件。
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Run Code Online (Sandbox Code Playgroud)
然后添加-newer timestamp
到find
表达式以对最后修改时间比时间戳文件新的文件子集进行操作。每次运行后继续更新时间戳文件。
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Run Code Online (Sandbox Code Playgroud)
这是一种避免不得不求助于 Makefile 的简单方法(除非您已经在使用它),这也是它值得find
尽可能使用的另一个很好的理由……它具有多功能的表现力,同时保持简洁。
小智 9
您可以convert
直接执行此操作。这可以在 ImageMagicks 站点关于命令行处理的底部找到。
convert *.jpg +adjoin page-%d.pdf
Run Code Online (Sandbox Code Playgroud)
我已经将以下 makefile 用于类似的东西:
SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))
all: $(PNG)
%.png: origs/%.svg
convert -resize "64x" $< $@
clean:
rm $(PNG)
Run Code Online (Sandbox Code Playgroud)
现在我可以运行make
并为周围的每个 svg 文件获取 png 文件。
编辑
按照要求:
origs/foo.svg
变成foo.png
)all: $(PNG)
定义目标“all”取决于所有 PNG%.png: origs/%.svg
定义,文件$X.png依赖于origs/$X.svg,可以通过调用生成convert ... $< $@
。
$<
是依赖和和 $@
是目标名称