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

时间:2016-11-11 17:52:24

标签: bash imagemagick imagemagick-convert subdirectory

在子文件夹中包含需要限制尺寸的图像(最大宽度为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 $'\0' line; do convert -resize 720x1100\> $line; done

它给了我错误信息"转换:没有定义图像。"然后:

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

给了我同样的错误信息。

2 个答案:

答案 0 :(得分:4)

看来你正在寻找这个:

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

在您的示例中,您剥离了.jpg扩展名,然后将其添加回来。根本不需要剥离,这简化了很多事情。 此外,convert filename filenamemogrify filename实际上相同。 mogrify是ImageMagick的一部分,它对于原位修改文件,覆盖原始文件很有用。 convert对于创建新文件非常有用,可以保留原文。

答案 1 :(得分:0)

由于所有子目录都是两个级别,因此发现这有效:

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选项名称"但所有大于指定的图像都经过保留文件名的大小调整。