Use grep da opção --include :
grep -ir "string" --include="*.php" .
Quando eu quero realizar uma busca grep recursiva no diretório atual, geralmente faço:
grep -ir "string" .
Mas esse comando pesquisa dentro de todos os tipos de arquivos, incluindo arquivos binários (imagens, áudio, vídeo, etc ...), o que resulta em um processo de pesquisa muito lento.
Se eu fizer isso, por exemplo, não funciona:
grep -ir "string" *.php
Ele não funciona porque não há arquivos PHP dentro do diretório atual, mas dentro de alguns dos subdiretórios no diretório atual, e os nomes dos subdiretórios não terminam com ".php", então o grep não parece dentro deles.
Então, como posso fazer uma pesquisa recursiva a partir do diretório atual, mas também especificando curingas de nome de arquivo? (ou seja, pesquisar apenas em arquivos que terminam em uma extensão específica)
Se você tiver uma versão de grep sem a opção --include , use o seguinte. Ambos foram testados em uma estrutura de diretórios como esta:
$ tree
.
├── a
├── b
│ └── foo2.php
├── c
│ └── d
│ └── e
│ └── f
│ └── g
│ └── h
│ └── foo.php
├── foo1.php
└── foo.php
Onde todos os arquivos .php contêm a 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
Isso localizará todos os arquivos .php e, em seguida, executará grep -H string em cada um deles. Com a opção find do -exec , {} é substituído por cada um dos arquivos encontrados. O -H informa grep para imprimir o nome do arquivo, bem como a linha correspondente.
Supondo que você tenha uma versão nova o suficiente de bash , use globstar :
$ shopt -s globstar
$ grep -H string **/*php
b/foo2.php:string
c/d/e/f/g/h/foo.php:string
foo1.php:string
Como explicado no manual do bash :
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.
Portanto, executando shopt -s globstar , você está ativando o recurso e
A opção globstar do Bash que torna **/*php expandida para todos os arquivos .php no diretório atual ( ** corresponde a 0 ou mais diretórios, portanto **/*php corresponde também a ./foo.php ), que são agrupados por string .
Use */*.php
Isto faz com que o grep pesquise um nível de subdiretório
Tags command-line bash grep linux file-filter