递归生成和移动缩略图

递归生成和移动缩略图

我想要一个执行以下操作的 bash 脚本:

  • 从当前目录向下递归查找图片(jpg,jpeg,JPG,JPEG)
  • 使用imagemagick的convert生成缩略图
  • 将缩略图移动到其他目录

我当前的脚本如下所示:

for f in `find . -type f -iname "*.jpg"`
  do
  convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
  mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/
done

它不会转换包含空格/特殊字符的文件(或包含所有内容的文件夹)。我尝试过,print0但没有帮助。

答案1

不要迭代 的输出find。您遇到的问题是这种情况的典型后果。

由于文件重命名,您的示例有点棘手。一种不是很有效但安全的方法是使用-exec,find以及每个文件的附加选项sh,如下所示:

find . -type f -iname "*.jpg" -exec sh -c 'echo convert "$1" -resize 800x800\> /home/user/thumbs/"${1%.jpg}_thumb.jpg"' -- {} \;

如果您不介意使用相同的名称(使用.jpg后缀而不是_thumb.jpg),那么这个简单的形式就可以工作,并且效率更高:

find . -type f -iname "*.jpg" -exec echo convert "{}" -resize 800x800\> /home/user/thumbs/"{}" \;

echo在那里添加了语句以在执行命令之前检查输出。如果输出看起来不错,请将其删除。

答案2

您可以使用更高级的选项,例如-set结合逃逸百分比%t即提取不带目录或扩展名的文件名)通过一次调用即可调整每个文件的大小、重命名和移动convert

find . -type f -iname \*.jpg -exec convert {} -resize 800x800\> \
-set filename:name '%t' '/home/user/thumbs/%[filename:name]_thumb.jpg' \;

答案3

在您的解决方案中,文件名默认被分割,$IFS其中包含空格。

请尝试以下操作:

while IFS= read -rd '' f; do

    convert ./"$f" -resize 800x800\> ./"${f%.jpg}_thumb.jpg"
    mv ./"${f%.jpg}_thumb.jpg" /home/user/thumbs/

done < <(find . -type f -iname "*.jpg" -print0)

打印find由空字节 ( ) 分隔的文件名\0,并使用-d ''您将 的分隔符设置read为相同的。

相关内容