如何在顺序函数上调整图像大小?

如何在顺序函数上调整图像大小?

我在尝试着:

  • 更改我的图像格式,
  • 然后将其高度和宽度调整为 40%
  • 然后将其质量优化至源的最大 35%,并将图像的总大小优化至源的 35%。

这是我的代码:

find . -name '*.png' -exec mogrify -format jpg {} + &&
find . -name '*.{jpeg,jpg}' -exec convert -resize 40% _resized.jpg {} + &&
find ./*.{jpeg,jpg} -exec jpegoptim   -m 35%  --size=35% {} \;

调整大小 - 第 2 行 - 似乎失败了。当我查看图像属性时,我得到相同的图像尺寸。

我希望新图像: - 调整大小 - 具有原始名称+名称末尾的“调整大小”字样

答案1

第二个命令的主要问题是find不理解大括号扩展,{jpeg,jpg}因此会将其视为文字字符串。第二个问题是,通过使用{} +参数形式,您试图将多个文件传递给convert.

注意:echo只有当您对下面的命令执行正确的操作感到满意时才删除。

也许你想要的是这样的:

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  for f; do 
    ext="${f##*.}"; echo convert -resize 40% "$f" "${f%.*}_resized.$ext"
  done
' find-sh {} +

\(...括号\)是必要的,因为-exec结合比 更强-o。如果没有它们,-name '*.jpeg'将找到匹配的文件但不会转换。

如果您对输出文件名不那么挑剔,您可以将上面的内容简化为

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  for f; do 
    echo convert -resize 40% "$f" "${f%.*}_resized.jpg"
  done
' find-sh {} +

.jpg(即使原始文件具有扩展名,也会生成带有扩展名的输出文件.jpeg)甚至

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  for f; do 
    echo convert -resize 40% "$f" "${f}_resized.jpg"
  done
' find-sh {} +

(这将产生类似的输出文件foo.jpeg_resized.jpg)。

如果您也不关心效率,您可以为找到的每个文件进行一次 shell 调用并取消 shell 循环:

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec sh -c '
  echo convert -resize 40% "$1" "${1}_resized.jpg"
' find-sh {} \;

请注意,在第三个命令中

find ./*.{jpeg,jpg} -exec jpegoptim   -m 35%  --size=35% {} \;

你的可能会扩展未引用的内容{jpeg,jpg},但这也不是您想要的 - 再次,这应该是

find . \( -name '*.jpeg' -o -name '*.jpg' \) -exec jpegoptim -m 35%  --size=35% {} \;

答案2

如果我理解正确的话,请告诉我这是否对您有帮助:

find . -name "*.jpeg" -o -name "*.jpg" -exec bash -c 'convert -resize 40% "{}" "{}"_resized.jpg' \;

相关内容