递归批量调整大小并保留文件名的Bash转换

8

有一些图片在子文件夹中,需要限制它们的大小(最大宽度为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

出现错误信息 “convert:未定义图像。” 然后:

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

让我收到了相同的错误信息。


如果您正在使用Bash 4,则可以轻松修改您的第一次尝试以处理目录树中的所有jpg文件:shopt -s globstar; for img in ** / * .jpg; do ...; done - pjh
还尝试过 find . -type d -exec bash -c 'cd "$0" || exit; shopt -s nullglob; f=( *.jpg ); ((${#f[@]})) && echo convert -resize 640x1100\> "${f[@]}" "${f[@]}"' {} \;,基于 http://stackoverflow.com/questions/23311384/execute-imagemagick-convert-in-subfolders-with-bash-script - motorbaby
我升级了Bash,然后出现了convert: unable to open image '**/*.jpg': No such file or directory的错误。 - motorbaby
啊!我漏掉了一个子目录级别...这样就可以了。非常感谢! - motorbaby
2个回答

9

看起来你只是在寻找这个:

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

在你的例子中,你去掉了.jpg扩展名,然后再添加回来。其实根本不需要这样做,这样会大大简化问题。
此外,convert filename filenamemogrify filename是完全一样的。 mogrify是ImageMagick的一部分,它有助于直接修改文件,覆盖原始文件。而convert 则用于创建新文件,保留原始文件。

谢谢。我以前用mogrify运气不好,所以有些犹豫使用它。但这个很好用,正是我需要的。谢谢! - motorbaby

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 选项名称”,但所有大于指定大小的图像都已调整大小并保留了文件名。


然而,真正的问题是如何搜索所有级别的目录。 - motorbaby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接