当我想在当前目录中执行递归 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
。
使用
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
文件名以及匹配的行。假设您有一个足够新的版本
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.php
string
答案3
使用*/*.php
这使得 grep 搜索一级子目录