在行命令中调整图像列表的大小

时间:2009-02-18 16:44:22

标签: linux bash shell imagemagick

我想在目录中调整图像列表的大小。为实现这一目标,我使用了imagemagick中的convert。我想调整大小

image1.jpg
image2.jpg
...

image1-resized.jpg
image2-resized.jpg
...

我想知道是否有一种方法可以在一个命令行中实现这一点。优雅的解决方案通常很有用,不仅仅是在这种情况下。

编辑:

我想要一个 类似脚本的解决方案,即。没有for循环。

4 个答案:

答案 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