Bash 以递归方式转换调整大小并保留文件名

Bash convert resize recursively preserving filenames

子文件夹中的图像需要限制大小(最大宽度 720 或最大高度 1100)。必须保留它们的文件名。开始于:

for img in *.jpg; do filename=${img%.*}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"; done 

在每个目录中都可以使用,但是有很多包含这些图像的子文件夹。已尝试 find . -iname "*.jpg" -exec cat {} 但未按预期创建列表。

这也没有用:

grep *.jpg | while read line ; do `for img in *.jpg; do filename=${img%.jpg}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"`; done 

这也没有:

find . -iname '*jpg' -print0 | while IFS= read -r -d $'[=13=]' line; do convert -resize 720x1100\> $line; done

这给了我错误信息 "convert: no images defined." 然后:

find . -iname '*.jpg' -print0 | xargs -0 -I{} convert -resize 720x1100\> {}

给我同样的错误信息。

由于所有子目录都向下两级,因此发现此方法有效:

for img in **/*/*.jpg ; do filename=${img%.*}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"; done

感谢@pjh 让我入门。这也有效:

shopt -s globstar ; for img in */*/*.jpg ; do filename=${img%.*}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"; done

但我收到错误消息“-bash: shopt: globstar: 无效 shell 选项名称”,但所有大于指定的图像都已调整大小并保留文件名。

看来您正在寻找的只是这个:

find /path/to/dir -name '*.jpg' -exec mogrify -resize 720x1100\> {} \;

在您的示例中,您删除了 .jpg 扩展名,然后将其添加回去。根本不需要剥离,这大大简化了事情。 此外,convert filename filenamemogrify filename 实际上是一样的。 mogrify 是 ImageMagick 的一部分,它对于就地修改文件、覆盖原始文件很有用。 convert 对于创建新文件、保留原始文件很有用。