我正在编写一个 bash 脚本来查找文件夹中的所有图像,并使用 ImageMagick 查找它们是否有损坏的结尾。
这是我试图自动化的命令:
identify -verbose *.jpg 2>&1 | grep "Corrupt" | egrep -o "([\`].*[\'])"
我遇到的问题是将识别命令存储到变量中。
命令中存在多种类型的引号我不断收到错误第 8 行:损坏:找不到命令
#!/bin/bash
# This script will search for all images that are broken and put them into a text file
FILES="*.jpg"
for f in $FILES
do
corrupt = "identify -verbose \"$f\" 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\""
if [ -z "$corrupt" ]
then
echo $corrupt
else
echo "not corrupt"
fi
done
有没有办法正确地逃避该命令?
更新:
一些进展:
#!/bin/bash
# This script will search for all images that are broken and put them into a text file
FILES="*.jpg"
for f in $FILES
do
echo "Processing $f"
corrupt="identify -verbose $f 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\""
if [ -z "$corrupt" ]
then
echo $corrupt
else
echo "not corrupt"
fi
done
这不再抛出错误,但看起来它只是将变量存储为字符串。
我怎样才能运行这个命令?
更新:一些进展。现在命令正在运行:
#!/bin/bash
# This script will search for all images that are broken and put them into a text file
FILES="*.jpg"
for f in $FILES
do
echo "Processing $f"
corrupt=`identify -verbose $f | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\"`
$corrupt
if [ -z "$corrupt" ]
then
echo $corrupt
else
echo "not corrupt"
fi
done
但管道的输出是分开的:
Processing sdfsd.jpg
identify-im6.q16: Premature end of JPEG file `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.
identify-im6.q16: Corrupt JPEG data: premature end of data segment `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.
我只需要决赛`sdfsd.jpg'细绳。
答案1
您可能正在寻找一种识别损坏图像的方法。可以轻松查询该identify
工具的退出状态,看看它是否能够识别图像文件。
#!/bin/sh
for name in *.jpg; do
if identify -regard-warnings -- "$name" >/dev/null 2>&1; then
printf 'Ok: %s\n' "$name"
else
printf 'Corrupt: %s\n' "$name"
fi
done
上面使用退出状态来identify
确定文件是否损坏。选项-regard-warnings
将您提到的警告升级为错误,这会使它们影响实用程序的退出状态。
您很少需要在变量中存储实际的通配模式。您通常可以通过测试实用程序的退出状态(如我们上面所示)来获取实用程序的成功/失败状态,而无需解析工具的输出。
对于较旧的 ImageMagick 版本(我使用的是 6.9.12.19),请使用convert
而不是identify
.
#!/bin/sh
for name in *.jpg; do
if convert -regard-warnings -- "$name" - >/dev/null 2>&1; then
printf 'Ok: %s\n' "$name"
else
printf 'Corrupt: %s\n' "$name"
fi
done
上面的循环尝试转换每个图像,如果处理图像文件失败,则由语句检测到if
。我们丢弃转换操作的结果。