我想在目录中调整图像列表的大小。为实现这一目标,我使用了imagemagick中的convert
。我想调整大小
image1.jpg
image2.jpg
...
到
image1-resized.jpg
image2-resized.jpg
...
我想知道是否有一种方法可以在一个命令行中实现这一点。优雅的解决方案通常很有用,不仅仅是在这种情况下。
编辑:
我想要一个非 类似脚本的解决方案,即。没有for循环。
答案 0 :(得分:10)
如果您想将它们调整为800x600:
for file in *.jpg; do convert -resize 800x600 -- "$file" "${file%%.jpg}-resized.jpg"; done
(在bash中工作)
答案 1 :(得分:8)
ls *.jpg|sed -e 's/\..*//'|xargs -I X convert X.jpg whatever-options X-resized.jpg
如果你愿意接受一个稍微不同的最终文件名,'resized-image1.jpg'而不是'image1-resized.jpg',你可以消除sed和扩展通用:
ls|xargs -I X convert X whatever-options resized-X
答案 2 :(得分:4)
GNU Parallel比循环更容易,并且通常更快:
parallel convert -resize 800x600 -- "{}" "{.}-resized.jpg" ::: *.jpg
这里有一些事情,从右到左:
::: *.jpg
表示为每个jpg文件运行命令{.}
表示插入当前文件名而不带后缀(.jpg
){}
表示插入当前文件名parallel
表示并行多次运行以下命令。它将选择并行执行的最大值以匹配您的计算机具有的核心数。当每个人完成后,它将启动下一个,直到所有的jpg文件都被转换。这会为每个文件运行命令convert --resize 800x600 -- foo.jpg foo-resized.jpg
。 --
告诉转换为停止处理标志,以防文件名恰好以-
开头。
P.S。在我的Mac上,我安装了Homebrew,因此我可以安装并行并使用
进行转换brew install parallel
brew install imagemagick
答案 3 :(得分:2)
如果您的图片文件有不同的扩展名:
for f in *; do convert -resize 800x600 -- "$f" "${f%.*}-resized.${f##*.}"; done