bash:对 find -exec 的错误处理

Phl*_*hll 5 shell bash find

我正在使用这个小脚本来查找格式错误的图像:

find -name '*.jpg' -exec identify -format "%f\n" {} \; 2>errors.txt
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但现在我需要稍微修改它。我不想将 stderr 转储到 errors.txt,而是想转储触发错误的图像的文件名 (%f)。也就是说,我想要errors.txt 中格式错误的图像文件的列表,而不是列表错误消息。

我尝试添加 || echo "%f" >> errors.txt 到 -exec 部分,但这不起作用。什么是最好的方法来做到这一点?

Joh*_*024 7

这会找到格式错误的图像并将其名称存储在names.txt

find -name '*.jpg' -exec bash -c 'identify "$1" &>/dev/null || echo "$1">>names.txt' none {} \;
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

  • 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. 除非bash 生成错误,否则$0不会使用它,在这种情况下,它将作为程序名称出现在错误消息中

讨论

我尝试添加|| echo "%f" >> errors.txt到 -exec 部分,但这不起作用。什么是最好的方法来做到这一点?

微妙之处在于||必须对identify命令进行操作。为此,我们需要放入identify一个外壳,例如使用bash -c如上所示。