在imagemagick中使用循环的TCropping图像

时间:2015-05-29 20:21:45

标签: bash imagemagick

一个非常基本的问题,但我是新手 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中使用带有空格名称的文件夹,你需要逃避空间。

1 个答案:

答案 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,但这是解释和理解符号的最简单方法。