我正在使用这个小脚本来查找格式错误的图像:
find -name '*.jpg' -exec identify -format "%f\n" {} \; 2>errors.txt
它运行得很好,但现在我需要稍微修改一下。我不想将 stderr 转储到 error.txt,而是转储触发错误的图像的文件名 (%f)。也就是说,我想要 error.txt 中格式错误的图像文件的列表,而不是错误消息的列表。
我尝试添加|| echo "%f" >>Errors.txt 到 -exec 部分,但这不起作用。最好的方法是什么?
答案1
这会找到格式错误的图像并将其名称存储在names.txt
:
find -name '*.jpg' -exec bash -c 'identify "$1" &>/dev/null || echo "$1">>names.txt' none {} \;
怎么运行的
find -name '*.jpg'
这会像往常一样启动
find
。-exec bash -c 'identify "$1" &>/dev/null || echo "$1" >>names.txt' none {} \;
这
identify
在每个文件上运行,如果identify
返回非零错误代码,它将文件名回显为names.txt
.bash -c '...' none {}
使 bash shell 运行引号中的命令,并将文件名{}
分配给位置参数$1
。出于好奇,该字符串
none
被分配给$0
。$0
未使用除非在这种情况下 bash 会生成错误它将作为程序名称出现在错误消息中。
讨论
我尝试添加
|| echo "%f" >> errors.txt
到 -exec 部分,但这不起作用。最好的方法是什么?
微妙之处在于必须||
根据命令进行操作identify
。为此,我们需要放入identify
一个 shell,例如使用bash -c
上面所示的方法。
答案2
find . -name '*.jpg' -exec sh -c '
for file do
if identify "$file"; then
printf "%s\n" "$file" >&3
else
printf "%s\n" "$file" >&4
fi
done' sh {} + 3> good 4> bad > /dev/null 2>&1
答案3
所以你想要像...
find . -name '*.jpg' \
! -exec identify -silent {} \; \
-print 2>/dev/null >errors.txt