如何递归地grep所有目录和子目录?

find . | xargs grep "texthere" *

当前回答

如果您知道所需文件的扩展名或模式,另一种方法是使用--include选项:

grep -r --include "*.txt" texthere .

您还可以使用--exclude提及要排除的文件。

Ag

如果您经常搜索代码,Ag(银搜索器)是grep的一个更快的替代方案,它是为搜索代码而定制的。例如,默认情况下,它是递归的,并自动忽略.gitignore中列出的文件和目录,因此您不必一直向grep或find传递同样繁琐的排除选项。

其他回答

注意这个发现-当查找匹配的文件太多时,键入f | xargs grep任何类型的解决方案都会遇到“Argument list to long”错误。

最好的选择是grep-r,但如果不可用,请使用find-键入f-exec grep-H whatever{}\;相反

把我的两分钱扔在这里。正如其他人已经提到的那样,grep-r并不适用于所有平台。这听起来可能很傻,但我总是使用git。

git grep "texthere"

即使目录没有暂存,我也只是暂存并使用git grep。

ag是我现在最喜欢的实现方式github.com/ggreer/the_silver_searcher。它基本上与ack相同,但还有一些优化。

这是一个简短的基准。我在每次测试前清除缓存(cfhttps://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

有关可用标志的列表:

grep --help 

返回当前目录中此处的regexp文本的所有匹配项,以及相应的行号:

grep -rn "texthere" .

返回文本的所有匹配项,从根目录开始,具有相应的行号,忽略大小写:

grep -rni "texthere" /

此处使用的标志:

-r递归-n带输出的打印行号-我不理这个案子

对于.gz文件,递归扫描所有文件和目录更改文件类型或放置*

find . -name \*.gz -print0 | xargs -0 zgrep "STRING"