使用 find 和 grep 递归搜索字符串时如何避免“权限被拒绝”错误消息?

使用 find 和 grep 递归搜索字符串时如何避免“权限被拒绝”错误消息?

我用

find -type f -print0 | xargs -0 -n 10 grep -i searchstring

...递归搜索字符串。但它也给了我诸如“权限被拒绝”之类的错误消息。如何避免此类错误消息并只看到结果?

答案1

将标准错误重定向到 /dev/null。 IE

find -type f -print0 2>/dev/null | xargs -0 -n 10 grep -i searchstring 2>/dev/null

答案2

如果错误消息来自 find (例如,因为有一个您无法遍历的目录,请将其错误重定向到/dev/null.

find -type f -print0 2>/dev/null | …

如果错误消息来自 grep (例如,因为某些文件不可读),请将其错误重定向到/dev/null,或传递-s选项以告诉它忽略不可读的文件。

xargs -0 grep -s -i searchstring /dev/null

限制一起传递到grep.但是您应该添加/dev/null以便grep始终看到至少两个文件,否则grep如果只有一个文件参数,则在其输出中省略文件名。对于 GNU grep 或 Busybox(即 Linux 或 Cygwin),您可以使用该-H选项。

答案3

要仅搜索您有权访问的目录并仅检查您能够读取的文件,使用 GNU find(这是问题中使用的),您可以使用-executableand进行测试-readable,如果您对每个目录具有访问和读取权限你遇到的。如果您对某个目录没有这些权限,您可以-prune从搜索树中搜索该路径。将测试任何剩余的文件-readable以确保您可以读取它。

这可以避免导致“权限被拒绝”错误,但也不会隐藏您可能遇到的任何其他错误查看:

find . \
    -type d ! \( -readable -executable \) -prune -o \
    -type f -readable -exec grep -F -i searchstring {} +

grep批量提供常规文件的路径名,以避免为每个遇到的文件调用该实用程序。我还使用-Fwithgrep暗示searchstring查询是使用不被解释为正则表达式的内容进行的。

相关内容