bash:find -exec 上的错误处理

bash:find -exec 上的错误处理

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

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

相关内容