我在尝试着:
- 更改我的图像格式,
- 然后将其高度和宽度调整为 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' \;