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

find . | xargs grep "texthere" *

当前回答

如果您正在从目录结构中查找所有文件中的特定内容,您可以使用find,因为它更清楚您在做什么:

find -type f -exec grep -l "texthere" {} +

注意,-l(l的小写)显示包含文本的文件的名称。如果要打印匹配项本身,请将其删除。或者使用-H将文件与匹配项一起获取。总之,其他备选方案包括:

find -type f -exec grep -Hn "texthere" {} +

其中-n打印行号。

其他回答

只是为了好玩,如果@christangrant的答案太多而无法输入,可以快速搜索*.txt文件:-)

grep-r文本此处|grep.txt文件

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

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

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

Ag

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

在POSIX系统中,找不到grep的-r参数和grep-rn“东西”。不会运行,但如果使用find命令,它将:

查找-键入f-exec grep-n“stuff”{}\-打印

Solaris和HP-UX同意。

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

git grep "texthere"

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

有关可用标志的列表:

grep --help 

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

grep -rn "texthere" .

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

grep -rni "texthere" /

此处使用的标志:

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