如何使用通配符“ grep”递归过滤所需文件的名称?


40

当我想在当前目录中执行递归grep搜索时,通常会执行以下操作:

grep -ir "string" .

但是该命令会在各种文件中进行搜索,包括二进制文件(图片,音频,视频等),这将导致搜索过程非常缓慢。

例如,如果执行此操作,将无法正常工作:

grep -ir "string" *.php

它不起作用,因为当前目录中没有PHP文件,但是当前目录中的某些子目录中没有,并且子目录的名称不以“ .php”结尾,因此grep不在其中查找。

那么,如何在当前目录中进行递归搜索,同时指定文件名通配符呢?(即:仅搜索以特定扩展名结尾的文件)

Answers:


58

使用grep--include选项:

grep -ir "string" --include="*.php" .

1
好的,我的grep版本似乎很旧,因为它没有该选项(难怪我为什么不知道该怎么做!)。我收到消息:“ grep:无法识别的选项'--include = *。php'”。但是我只是升级到了更新的版本,现在可以使用了。谢谢!
OMA 2014年

我必须在末尾替换该期间并使用:grep -ir "string" --include="*.php" *
Stuart

我以为期间才刚刚结束!我没有使用或需要。
boardtc

14

如果您的版本grep缺少该--include选项,则可以使用以下选项。它们都在这样的目录结构上进行了测试:

$ tree
.
├── a
├── b
   └── foo2.php
├── c
   └── d
       └── e
           └── f
               └── g
                   └── h
                       └── foo.php
├── foo1.php
└── foo.php

其中所有.php文件都包含字符串string

  1. 使用 find

    $ find . -name '*php' -exec grep -H string {} +
    ./b/foo2.php:string
    ./foo1.php:string
    ./c/d/e/f/g/h/foo.php:string

    说明

    这将找到所有.php文件,然后grep -H string在每个文件上运行。使用find-exec选项,{}将替换为找到的每个文件。该-H通知grep要打印的文件名,以及匹配线路。

  2. 假设您有足够新的版本bash,请使用globstar

    $ shopt -s globstar
    $ grep -H string  **/*php
    b/foo2.php:string
    c/d/e/f/g/h/foo.php:string
    foo1.php:string

    说明

    bash手册中所述

    全球星

    如果设置,则在文件名扩展上下文中使用的模式“ **”将匹配所有文件以及零个或多个目录和子目录。如果模式后跟一个'/',则仅目录和子目录匹配。

    因此,通过运行shopt -s globstar您可以激活该功能和Bash的globstar选项,该选项可**/*php扩展到.php当前目录中的所有文件(**匹配0个或多个目录,因此也**/*php匹配./foo.php),然后将其grep string


-2

使用 */*.php

这使grep搜索一级子目录


星号和点消失了,出现了问题。
丹尼斯·诺兰'04

您可以使用反引号来格式化代码,并避免在使用星号强调降价格式化时产生歧义。PS注意,该问题在最后一段中询问有关“递归搜索”的问题(尽管不是我的观点)。
RedGrittyBrick '16

正如您提到的那样,这不是一个正确的答案,因为它仅对一级深度目录结构有好处,但是尽管如此,仍然要知道;)。我对此表示赞同。
OMA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.