How can I "grep" recursively filtering the name of the files I want with wildcards?
Use grep
's --include
option:
grep -ir "string" --include="*.php" .
If you have a version of grep
that lacks the --include
option, you can use the following. These were both tested on a directory structure like this:
$ tree
.
├── a
├── b
│ └── foo2.php
├── c
│ └── d
│ └── e
│ └── f
│ └── g
│ └── h
│ └── foo.php
├── foo1.php
└── foo.php
Where all the .php
files contain the string string
.
-
Use
find
$ find . -name '*php' -exec grep -H string {} + ./b/foo2.php:string ./foo1.php:string ./c/d/e/f/g/h/foo.php:string
Explanation
This will find all
.php
files and then rungrep -H string
on each of them. Withfind
's-exec
option,{}
is replaced by each of the files found. The-H
tellsgrep
to print the file name as well as the matched line. -
Assuming you have a new enough version of
bash
, useglobstar
:$ shopt -s globstar $ grep -H string **/*php b/foo2.php:string c/d/e/f/g/h/foo.php:string foo1.php:string
Explanation
As explained in the bash manual:
globstar
If set, the pattern ‘**’ used in a filename expansion context will match all files and zero or more directories and subdirectories. If the pattern is followed by a ‘/’, only directories and subdirectories match.
So, by running
shopt -s globstar
you are activating the feature and Bash'sglobstar
option which makes**/*php
expand to all.php
files in the current directory (**
matches 0 or more directories, so**/*php
matches./foo.php
as well) which are then grepped forstring
.