当我打电话时
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 -r
让open()
调用发现您无法读取它,而版本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