在 imagemagick 中使用循环裁剪图像
TCropping images with loop in imagemagick
一个非常基本的问题,但我是新手
Imagemagick(和 bash),我在文件夹中批量裁剪图像时遇到问题。我试过使用循环:
for image in '/home/donald/Desktop/New Folder'*.jpg; do
convert "$image" -gravity center -crop 95X95% "${image%.jpg}"-modified.jpg
done
但是 returns:
convert.im6: unable to open image `/home/donald/Desktop/New Folder/*.jpg': No such file or directory @ error/blob.c/OpenBlob/2638.
convert.im6: no images defined `/home/donald/Desktop/New Folder/*-modified.jpg' @ error/convert.c/ConvertImageCommand/3044."
这样做的正确方法是什么?
编辑:显然文件夹名称中的 space 导致了问题我删除了它,如果你想在bash 你需要转义 space。
我相信您在 /home/donald/Desktop/New Folder/
目录中没有 jpg
个文件。如果没有文件匹配通配符字符串,shell 会将其解释为文字字符串 /home/donald/Desktop/New Folder/*.jpg
。
看这个例子:
$ for f in *.jpg*; do echo $f; done
file.jpg
file2.jpg
$ for f in *.jpgg; do echo $f; done
*.jpgg
看到最后一个是文字字符串而不是真实文件了吗?如果它是的话,它也应该是第一次显示(注意 *.jpg*
中尾随的星号)。
您可以通过使用 [ -f "${file}" ]
在执行命令之前检查文件是否存在来解决此问题。例如:
for image in '/home/donald/Desktop/New Folder'*.jpg; do
[ -f "${image}" ] && convert "$image" -gravity center -crop 95X95% "${image%.jpg}"-modified.jpg
done
这将检查文件 image
是否存在 (-f
) 并且仅当 returned &&
为真时才执行以下语句。如果你写 ||
而不是 &&
那么下面的语句将在 false 被 returned 时执行。
请注意,bash 与 return 无关,但这是解释和理解符号的最简单方法。
一个非常基本的问题,但我是新手 Imagemagick(和 bash),我在文件夹中批量裁剪图像时遇到问题。我试过使用循环:
for image in '/home/donald/Desktop/New Folder'*.jpg; do
convert "$image" -gravity center -crop 95X95% "${image%.jpg}"-modified.jpg
done
但是 returns:
convert.im6: unable to open image `/home/donald/Desktop/New Folder/*.jpg': No such file or directory @ error/blob.c/OpenBlob/2638.
convert.im6: no images defined `/home/donald/Desktop/New Folder/*-modified.jpg' @ error/convert.c/ConvertImageCommand/3044."
这样做的正确方法是什么?
编辑:显然文件夹名称中的 space 导致了问题我删除了它,如果你想在bash 你需要转义 space。
我相信您在 /home/donald/Desktop/New Folder/
目录中没有 jpg
个文件。如果没有文件匹配通配符字符串,shell 会将其解释为文字字符串 /home/donald/Desktop/New Folder/*.jpg
。
看这个例子:
$ for f in *.jpg*; do echo $f; done
file.jpg
file2.jpg
$ for f in *.jpgg; do echo $f; done
*.jpgg
看到最后一个是文字字符串而不是真实文件了吗?如果它是的话,它也应该是第一次显示(注意 *.jpg*
中尾随的星号)。
您可以通过使用 [ -f "${file}" ]
在执行命令之前检查文件是否存在来解决此问题。例如:
for image in '/home/donald/Desktop/New Folder'*.jpg; do
[ -f "${image}" ] && convert "$image" -gravity center -crop 95X95% "${image%.jpg}"-modified.jpg
done
这将检查文件 image
是否存在 (-f
) 并且仅当 returned &&
为真时才执行以下语句。如果你写 ||
而不是 &&
那么下面的语句将在 false 被 returned 时执行。
请注意,bash 与 return 无关,但这是解释和理解符号的最简单方法。