当我打电话
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 -r让open()调用找出你不能读取它,而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 / grep和grep -r与parallel方法进行基准testing并查看哪个方法更快将会很有趣。