我想调整目录中的所有图像列表的大小。为了实现这一点,我使用convert
了 imagemagick。我想调整大小
image1.jpg
image2.jpg
...
进入
image1-resized.jpg
image2-resized.jpg
...
我想知道是否有一种方法可以在单个命令行中实现这一点。一个优雅的解决方案通常很有用,不仅在这种情况下。
编辑:
我想要一个非 脚本式的解决方案,即。没有 for 循环。
我想调整目录中的所有图像列表的大小。为了实现这一点,我使用convert
了 imagemagick。我想调整大小
image1.jpg
image2.jpg
...
进入
image1-resized.jpg
image2-resized.jpg
...
我想知道是否有一种方法可以在单个命令行中实现这一点。一个优雅的解决方案通常很有用,不仅在这种情况下。
编辑:
我想要一个非 脚本式的解决方案,即。没有 for 循环。
如果要将它们调整为 800x600:
for file in *.jpg; do convert -resize 800x600 -- "$file" "${file%%.jpg}-resized.jpg"; done
(在 bash 中工作)
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
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
如果您的图像文件具有不同的扩展名:
对于 * 中的 f;转换 -resize 800x600 -- "$f" "${f%.*}-resized.${f##*.}"; 完毕