Bash t在imagemagick中使用循环复制图像

Bash t在imagemagick中使用循环复制图像,bash,imagemagick,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 `

这是一个很基本的问题,但我是新手 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中使用一个带有空格名的文件夹,你需要转义这个空格

我相信您在
/home/donald/Desktop/New Folder/
目录中没有
jpg
文件。如果没有与通配符ed字符串匹配的文件,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*
中的尾随asterix符号)

您可以通过在执行命令之前使用
[-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
这将检查文件
图像
是否存在(
-f
),并仅在返回true时执行以下语句。如果您编写了
|
而不是
&&
,那么返回false时将执行以下语句


请注意,bash不会返回true或false,但它是解释和理解符号的最简单方法

谢谢你的回答。我确实有一个jpg在文件夹中,但你是对的,它没有意识到它的存在。我只是勉强尝试将cd刻录到文件夹中,但它不起作用,所以我尝试删除文件夹名称中的空格,由于某些原因,现在一切正常。好的,很高兴听到这个消息!如果答案对你有效,不要忘记接受,如果你认为它是一个高质量的答案,不要忘记投票。如果你的解决方案不是从这个答案中得到启发:发布你的答案并接受它。你可以这样做,只是为了让下一个遇到这个问题的人能够更容易地找到他/她的问题的解决方案。有答案但没有公认答案的问题对社区不利!