我如何告诉 grep 在我有权限的文件中搜索?

我如何告诉 grep 在我有权限的文件中搜索?

当我打电话时

cd /
grep -r "some_str" .

然后我看到屏幕上打印出很多文件,在行末我看到“:权限被拒绝”。我如何告诉 bash 仅在我有权限的文件中搜索。这显然比标准 grep 更快。

答案1

使用find / -readable -print0 | xargs -0 grep -H "some_str"而不是grep -r。 (需要 GNU find,但是grep -r是 GNUish 所以我认为这不是问题。)

但事实上,它的速度并不“明显”;grep -ropen()调用发现您无法读取它,而版本find必须stat()先发现它,然后grep执行open()— 对于不可读的文件,其中最昂贵的部分是内核将路径名转换为文件系统索引节点。(实际上,对于任何相当大的文件,搜索可读文件将占用大部分执行时间。)很可能更快的方法只是附加到,2>/dev/null这样grep -r就不会浪费任何时间将错误消息打印到慢速终端。

答案2

您可以用来grep -s忽略有关无法读取文件的消息。

打印错误消息是唯一可能导致速度变慢的事情,它不像 grep 读取整个文件然后删除所有结果,因为它实际上没有读取它的权限。

答案3

您可以尝试查找:

find / -perm o=r -or -user <user> -exec grep whatever '{}' \;

但是,此命令不会搜索您通过组拥有权限的文件。

更新:有 find -readable,正如另一个答案所建议的那样。

答案4

这是一个有趣的方法GNU 并行,假设你的 find(1) 不支持该-readable标志:

find / -type f 2>/dev/null | parallel -m "grep blah {}"

并行选项-m使其在每次调用 grep 时填充尽可能多的文件,这比每次只 grep 一个文件更有效率。

我意识到这样做的一个问题是,除了权限问题之外,它还会丢弃其他find错误。我怀疑可能有一种使用 find 选项来解决这个问题的方法,-depth但我还没有探索过。

在多核系统上对这些方法进行基准测试并看看哪种方法更快find / grep将会grep -r很有趣。parallel

相关内容