我开发了这个简单的 bash 脚本:
#!/bin/bash
for img in `find ./to_upload -iname "*.jpg" -type f`
do
mogrify ‑resize 1024 ‑sample 70 ${img}
done
当我运行它时,脚本返回:
...
mogrify: unable to open image `‑resize': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image `1024': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image `‑sample': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image `70': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
...
对于每个文件。有什么问题?我正在使用 Debian 测试。
这不是脚本:
$ mogrify ‑resize 1024 ‑sample 70 image.jpg
mogrify: unable to open image `‑resize': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image `1024': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image `‑sample': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: unable to open image `70': No such file or directory @ error/blob.c/OpenBlob/2658.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
我正在使用 gnome 终端。我不明白,这可能是 debian 的一个错误吗?
mogrify -resize 1024 -sample 70 image.jpg
mogrify ‑resize 1024 ‑sample 70 image.jpg
我解决了,但我不明白为什么,第一行有效,但第二行无效。有人可以试试吗(在命令行中复制粘贴)?
答案1
我怀疑问题在于你已将命令复制并粘贴到 Microsoft Word(或某些类似的文本处理器)中,然后将其复制并粘贴回终端。在你的
mogrify ‑resize 1024 …
命令,其前面的字符resize
是 Unicode U+2011 字符,即不间断连字符(参见Unicode 图表)。尝试将其重新输入为普通破折号(又称减号)。
答案2
我假设你的文件名中有空格。使用for
循环进行迭代字以及一个while read
循环来迭代线
find ./to_upload -iname "*.jpg" -type f -print0 |
while IFS= read -r -d "" img; do
mogrify ‑resize 1024 ‑sample 70 "$img"
done
此外,在变量名周围使用双引号至关重要。
答案3
find ./to_upload -iname "*.jpg" -type f -exec mogrify ‑resize 1024 ‑sample 70 {} \;
请注意末尾奇怪的 \; - ';' 是 find 的 -exec 选项语法的一部分,因此必须以 '\' 作为前缀,以避免被 shell 解释。它告诉 find 对找到的每个文件只调用一次子命令。
如果 mogrify 每次调用接受多个文件,您也可以这样做(find 还确保它不超过 shell 允许的最大参数数量):
find ./to_upload -iname "*.jpg" -type f -exec mogrify ‑resize 1024 ‑sample 70 {} +
PS 我刚刚注意到您的评论“这不是脚本” - 我在 cygwin 上安装了 ImageMagick,使用您展示的表单它运行良好。也许可以尝试使用双破折号?
PSS 啊哈,我发现问题了!我复制了你的两行代码,检查了 ASCII 码,发现第二行中的 '-'(破折号、连字符)字符不是标准 ASCII 字符,而是一个 Unicode 字符,可能是因为脚本是从文字处理器复制而来的,文字处理器经常将连字符或引号翻译成打印起来更美观的特殊字符,但在任何编程语言中都不起作用(据我所知)
PSSS 然后我发现 G-Man 已经注意到了这一点,哦!