我想要一个执行以下操作的 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
答案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
为相同的。