find -exec - 仅针对查找抑制错误,但不抑制已执行命令的错误

find -exec - suppress errors only for find, but not for executed command

当运行执行find命令时,可能会输出“No such file or directory”的错误。

正如对 question here: 的回答,将文件描述符 2 重定向到 /dev/null 将愉快地消除来自 find 的错误消息,例如 No such file or directory:

find yada-yada... 2>/dev/null

这很好,只要不使用 -exec 来执行命令。因为 2>/dev/null 也会消除执行命令中的错误。

举个例子:

$ find /root -exec sh -c 'echo "Error" >&2' {} \; 2>/dev/null
$ find /root -exec sh -c 'echo "Error" >&2' {} \;
Error
find: ‘/root’: Permission denied

有没有办法在保留已执行命令的错误的同时消除来自 find 的错误?

find 命令中使用 -exec 选项是将 xargs 命令集成到 find 命令中。

您始终可以通过将 find 输出管道输送到 xargs 命令来将 find-exec 分开。

例如:

 find / -type f -name "*.yaml" -print0 2>/dev/null | xargs  ls -l
 

如果由于某种原因您不能使用:

find . -print0 2>/dev/null | xargs -0 ...

然后这里有一个 POSIX 方法来做同样的事情:

find . -exec sh -c '"[=11=]" "$@" 2>&3' ... {} + 3>&2 2>/dev/null

注: 3>&2位于之前 2>/dev/null