一个非常基本的问题,但我是新手 Imagemagick(和bash),我在批量裁剪文件夹中的图像时遇到问题。我尝试过使用循环:
for image in '/home/donald/Desktop/New Folder'*.jpg; do
convert "$image" -gravity center -crop 95X95% "${image%.jpg}"-modified.jpg
done
但它返回:
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."
这样做的正确方法是什么?
编辑:显然文件夹名称中的空格导致了我删除它的问题,似乎工作正常。显然,如果你想在bash中使用带有空格名称的文件夹,你需要逃避空间。
答案 0 :(得分:0)
我相信jpg
目录中没有/home/donald/Desktop/New Folder/
个文件。如果没有与通配符字符串匹配的文件,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
)并仅在返回true &&
时执行以下语句。如果您编写||
而不是&&
,则在返回false时将执行以下语句。
请注意,bash不会返回true或false,但这是解释和理解符号的最简单方法。