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

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

当我想在当前目录中执行递归 grep 搜索时,我通常会这样做:

grep -ir "string" .

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

例如,如果我这样做,它不起作用:

grep -ir "string" *.php

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

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

答案1

使用grep--include选项:

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

答案2

如果您的版本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匹配),然后对其进行 grep 。./foo.phpstring

答案3

使用*/*.php

这使得 grep 搜索一级子目录

相关内容