我怎么能告诉grepsearch文件,我有权限?

当我打电话

cd / grep -r "some_str" . 

然后我看到大量的文件打印在屏幕上,并在行结束我看到“:权限被拒绝”。 我如何告诉bash只能在我有权限的文件中search。 这将明显快于标准的grep。

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

但实际上并不是那么“显而易见”,而是更快; grep -ropen()调用找出你不能读取它,而find版本必须先stat() ,然后grep执行open() – 这是最昂贵的部分, t可读,是内核将path名转换为文件系统索引节点。 (实际上,search可读文件将是大量的执行时间,否则对于任何大小的文件)。更快的方法很可能是将2>/dev/null追加到grep -r所以没有任何时间丢失打印错误信息以减慢terminal。

您可以使用grep -s忽略有关不可读文件的消息。

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

你可以试试看:

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

但是,这个命令不会在文件中search,通过组来获得许可。

更新 :有find可读的,如另一个答案build议。

假设你的find(1)不支持-readable标志,这里有一个有趣的方式来使用GNU Parallel :

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

并行的-m选项使得每次调用grep时尽可能多地填充文件,这样更有效,一次只擦写一个文件。

我意识到这个问题,除了权限问题,它会抛出其他find错误。 我怀疑可能有办法解决这个与查找选项-depth但我还没有探讨。

在多核系统上对find / grepgrep -rparallel方法进行基准testing并查看哪个方法更快将会很有趣。