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