题 我如何递归grep?


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

find . | xargs grep "texthere" *

1350
2018-01-01 05:10


起源


@ TC1令人遗憾的是,grep本身可以回答这个问题(至少是GNU grep):grep --help | grep recursive - Frank Schmitt
如果您发现自己经常使用grep进行递归搜索(特别是如果您手动执行大量文件/目录exlusions),您可能会发现 ACK (非常适合程序员的grep替代方案)很有用。 - Nick McCurdy
实际上我在工作中使用的Solaris盒子上既没有-r也没有--recursive工作。并且grep的手册页没有提到递归的任何内容。我不得不亲自找到和xargs。 - Ben
ag是我现在最喜欢的方式 github.com/ggreer/the_silver_searcher - dranxo
grep -rin xlsx *.pl在Redhat Linux上对我不起作用。我得到一个“不匹配”的错误。 - Bulrush


答案:


grep -r "texthere" .

第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录。在这种情况下, . 表示当前目录。

注意:这适用于GNU grep,在Solaris等某些平台上,您必须专门使用GNU grep而不是遗留实现。对于Solaris,这是 ggrep 命令。


2035
2018-01-01 05:11



注意:“grep -r”仅适用于较新的greps。它不适用于随附的grep AIX 5.3 例如。 - Withheld
使用grep -R跟随符号链接。 - Eloff
很高兴知道“-i”会使它不区分大小写,“ - n”也包括每个匹配结果的行号。 - Sadegh
另外要知道的是,如果您只是寻找固定字符串而不是正则表达式,请使用-F选项。它会通过不调用正则表达式解析器来节省大量时间。如果您正在搜索大量文件,非常方便。 - Jeff
别名rgrep ='grep -r' - totten


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

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

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

如果您经常搜索代码, Ag(银色搜索者) 是一个比grep更快的替代品,它是为搜索代码而定制的。例如,它默认是递归的,并自动忽略其中列出的文件和目录 .gitignore,因此您不必继续将相同的繁琐排除选项传递给grep或find。


570
2017-12-30 22:59



适用于Linux和Cygwin附带的grep,但不适用于AIX附带的grep。 - Withheld
@KrzysztofWolny:``而不是 = 在Ubuntu上运行得很好。 PS:那应该是一个反击的空间,但SO降价解析器失败了。 - Dan Dascalescu
@DanDascalescu我投了赞成票 grep,不是为了Ag,只是让你知道:) - Bernhard
我们可以选择在递归搜索时排除目录吗? - rm -rf


也:

find ./ -type f -print0 | xargs -0 grep "foo"

grep -r 是一个更好的答案。


106
2018-01-01 05:14



+1这适用于HP-UX,其中“grep -r”没有。谢谢。 - Damo
或者,如果您不想担心文件名中的空格 find . -type f -exec grep "foo" '{}' \; 在支持的地方运作良好 - Edd Steel
+1这适用于AIX,其中“grep -r”没有。 - Withheld
如果您要通过xargs管道查找grep,如果您只搜索固定字符串(即,不是正则表达式),您可能会受益于调用grep -F选项,因此grep将不会加载正则表达式引擎每次调用。如果有很多文件会更快。 - Jeff
找 。 -type f -exec grep -Hu“foo”{} \;是我用的,因为它给出了文件名。 - Wes


我现在总是使用(甚至在Windows上使用 GoW - Windows上的Gnu):

grep --include="*.xxx" -nRHI "my Text to grep" *

这包括以下选项:

--include=PATTERN

在仅搜索文件匹配的目录中递归 PATTERN

-n, --line-number

使用输入文件中的行号为每行输出添加前缀。

-R, -r, --recursive

递归地读取每个目录下的所有文件;这相当于 -d recurse 选项。

-H, --with-filename

打印每个匹配的文件名。

-I     

处理二进制文件,就好像它不包含匹配数据一样;
  这相当于 --binary-files=without-match 选项。

我可以添加'i'(-nRHIi),如果我想要不区分大小写的结果。

我可以得到:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

83
2018-02-14 09:33



我来到这里的答案并不期望找到。 +1 - clintonmonk
Gow看起来很有前途 - 比我一直使用的GNU Windows实用程序更新。现在试试吧...... - Radim Cernej
这里的最后一个角色是什么意思? - lorniper
@lorniper它使shell选择当前目录中的所有文件和文件夹,反过来grep应用于那些文件和(递归因为 -R 选项)到文件夹。 - VonC
@lorniper Noy: * 要么 . 是一个glob模式(由shell解释): unix.stackexchange.com/a/64695/7490。 “.'也将选择点文件或点文件夹(如 .git/) - VonC


或者安装确认,如果你想要更快的方式并且正在做这么多。


53
2018-01-01 05:47



ack +1(某些发行版上的AKA“ack-grep”)。它的 grep -r 关于类固醇。 - ZoogieZork
不幸的是,更新版本的ack不再具备 -a 选项,因此它将跳过具有未知类型的文件 - Izkata
使用 ag 如果你真的需要速度粗略测试我刚做了搜索 /usr/share: grep 与 ack 与 fgrep 与 ag = 1m12s 与 45s 与 43s VS 3s - sjas
这不是一个完整的答案。你怎么安装ack?你怎么运行ack? - styfle
您可以将此添加为评论。 - Vimal Bhaskar


在POSIX系统中,您找不到 -r 参数 grep 和你的 grep -rn "stuff" . 不会运行,但如果你使用 find 命令它将:

find . -type f -exec grep -n "stuff" {} \; -print

同意 Solaris 和 HP-UX


19
2017-08-08 14:56



是什么意思 {} \; - 分别? - user1169587
在 -exec 选项 - 符号 {} 是对当前找到的文件名的引用 find 工具(也就是我们找到的文件名) -exec选项应该终止 ; symbol(标记exec命令的结尾),但是因为这一切都在shell中运行,符号应该被转义..最后 -print 选项让 find 用于在屏幕上打印找到的文件名的工具。 - rook


找到名字 files 同 path 递归地包含特定的 string 使用以下命令 对于 UNIX

find . | xargs grep "searched-string"

对于 Linux

grep -r "searched-string" .

找到一个文件 UNIX 服务器

find . -type f -name file_name

在LINUX服务器上找到一个文件

find . -name file_name

10
2018-01-29 14:31





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

这是一个简短的基准。我在每次测试之前清除缓存(参见 https://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

8
2018-05-21 23:37