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
当运行执行find
命令时,可能会输出“No such file or directory”的错误。
正如对 /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