Bash 脚本中的命令选项与文件名混合

Bash 脚本中的命令选项与文件名混合

我开发了这个简单的 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 已经注意到了这一点,哦!

相关内容