8

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

image1.jpg
image2.jpg
...

进入

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

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

编辑:

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

4

4 回答 4

10

如果要将它们调整为 800x600:

for file in *.jpg; do convert -resize 800x600 -- "$file" "${file%%.jpg}-resized.jpg"; done

(在 bash 中工作)

于 2009-02-18T16:51:21.200 回答
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
于 2009-02-18T17:06:23.957 回答
5

GNU Parallel甚至比 for 循环更容易,而且通常更快:

parallel convert -resize 800x600 -- "{}" "{.}-resized.jpg" ::: *.jpg

这里发生了一些事情,从右到左:

  • ::: *.jpg表示为每个 jpg 文件运行命令
  • {.}.jpg表示插入不带后缀 ( )的当前文件名
  • {}表示插入当前文件名
  • parallel表示并行运行以下命令多次。它将选择并行执行的最大值以匹配您计算机的内核数。当每一个完成时,它将启动下一个,直到所有 jpg 文件都被转换。

convert --resize 800x600 -- foo.jpg foo-resized.jpg将为每个文件运行命令。告诉 convert 停止处理标志,--以防文件名碰巧以-.

PS 在我的 Mac 上我安装了Homebrew,所以我能够并行安装并转换

brew install parallel
brew install imagemagick
于 2015-05-22T15:27:20.667 回答
2

如果您的图像文件具有不同的扩展名:

对于 * 中的 f;转换 -resize 800x600 -- "$f" "${f%.*}-resized.${f##*.}"; 完毕
于 2009-02-18T17:04:26.880 回答