当前位置:  开发笔记 > 编程语言 > 正文

我如何递归grep?

如何解决《我如何递归grep?》经验,为你挑选了13个好方法。

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

find . | xargs grep "texthere" *

Vinko Vrsalo.. 2430

grep -r "texthere" .

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

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



1> Vinko Vrsalo..:
grep -r "texthere" .

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

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


使用grep -R跟随符号链接.
很高兴知道"-i"会使它不区分大小写," - n"也包含每个匹配结果的行号.
注意:"grep -r"仅适用于较新的greps.例如,它不适用于`AIX 5.3`附带的grep.
另外要知道的是,如果您只是寻找固定字符串而不是正则表达式,请使用-F选项.它会通过不调用正则表达式解析器来节省大量时间.如果你正在搜索大量的文件非常方便.
别名rgrep ='grep -r'
在Cygwin上,为了搜索隐藏文件(以点开头)并在其中,你需要使用`find.-type f | xargs grep -l"搜索字符串"`.Cygwin上单独使用`grep -r`不会搜索隐藏文件.

2> christangran..:

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

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

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

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


@DanDascalescu我赞成了'grep`,而不是Ag,只是让你知道:)
适用于Linux和Cygwin附带的grep,但不适用于AIX附带的grep.

3> Kurt..:

也:

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

但是grep -r更好的答案.


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

4> VonC..:

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

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

这包括以下选项:

--include=PATTERN

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

-n, --line-number

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

(注意:phuclv 在评论中 添加-n了很多性能,因此您可能希望跳过该选项)

-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;
...


@lorniper它使shell选择当前目录中的所有文件和文件夹,反过来grep应用于这些文件和(递归地因为`-R`选项)到文件夹.
@lorniper Noy究竟:`*`或`.`是一个glob模式(由shell解释):http://unix.stackexchange.com/a/64695/7490.'.``'也会选择点文件或点文件夹(如`.git /`)

5> rook..:

在POSIX系统中,您没有找到-r参数,grep并且您grep -rn "stuff" .将无法运行,但如果使用find命令,它将:

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

同意SolarisHP-UX.


在`-exec`选项中 - 符号`{}`是对`find`工具当前找到的文件名的引用(即用我们找到的文件名做某事),`-exec`选项也应该以`` ;`符号(用于标记exec命令的结尾),但因为这一切都在shell中运行,符号应该被转义..最后`-print`选项让`find`工具在屏幕上打印出找到的文件名.

6> kenorb..:

通配符 **

使用grep -r作品,但它可能过度,特别是在大文件夹中.

有关更实际的用法,以下是使用globbing语法(**)的语法:

grep "texthere" **/*.txt

仅使用模式选择模式对特定文件进行grepping.它适用于支持的shell,如Bash +4zsh.

要激活此功能,请运行:shopt -s globstar.

另请参阅:如何在Linux上找到包含特定文本的所有文件?

git grep

对于Git版本控制下的项目,请使用:

git grep "pattern"

哪个更快.

ripgrep

对于较大的项目,最快的ripgrepgrepping 工具是默认情况下递归greps文件:

rg "pattern" .

它建立在Rust的正则表达式引擎之上,它使用有限自动机,SIMD和积极的文字优化来快速搜索.在这里查看详细分析.


感谢git grep建议 - 它非常有用,我不知道它!
感谢ripgrep的建议。它的速度更快。

7> chim..:

只是文件名也很有用

grep -r -l "foo" .



8> Girdhar Sing..:

要查找filespath递归方式包含string以下命令的特定用途的名称UNIX:

find . | xargs grep "searched-string"

用于Linux:

grep -r "searched-string" .

UNIX服务器上找到一个文件

find . -type f -name file_name

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

find . -name file_name



9> 小智..:

如果您只想关注实际目录,而不是符号链接,

grep -r "thingToBeFound" directory

如果你想跟随符号链接和实际目录(注意无限递归),

grep -R "thing to be found" directory

由于您尝试递归grep,以下选项也可能对您有用:

-H: outputs the filename with the line

-n: outputs the line number in the file

因此,如果要在当前目录或任何子目录中查找包含Darth Vader的所有文件并捕获文件名和行号,但不希望递归遵循符号链接,则命令将为

grep -rnH "Darth Vader" .

如果你想在目录中找到所有提到的单词cat

/home/adam/Desktop/TomAndJerry 

而你目前在目录中

/home/adam/Desktop/WorldDominationPlot

并且您想要捕获文件名但不是字符串"cats"的任何实例的行号,并且您希望递归遵循符号链接,如果找到它们,您可以运行以下任一项

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

资源:

运行"grep --help"

关于符号链接的简短介绍,对于任何阅读这个答案并且被我对它们的引用感到困惑的人:https: //www.nixtutor.com/freebsd/understanding-symbolic-links/



10> dranxo..:

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



11> sumit kumar..:

这应该工作:

grep -R "texthere" *



12> fedorqui..:

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

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

请注意-l(L的小写)显示包含文本的文件的名称.如果您想要打印匹配本身,请将其删除.或者用于-H将文件与匹配一起获取.总之,其他替代方案是:

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

在哪里-n打印行号.


向上投票是唯一的`find`解决方案,既避免了不必要的使用`xargs`又使用`+`而不是'\;`和`-exec`,从而避免了大量不必要的进程启动.:-)

13> arkod..:

这是我当前机器上的情况(Windows 7上的git bash):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

对于带空格的路径,我总是忘记-print0和-0.

编辑:我现在的首选工具是ripgrep:https://github.com/BurntSushi/ripgrep/releases.它真的很快并且具有更好的默认值(默认情况下是递归的).与我原来的答案相同,但使用ripgrep:rg -g "*.cs" "content pattern"

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有