Quando eu quero executar uma pesquisa grep recursiva no diretório atual, geralmente:
grep -ir "string" .
Mas esse comando pesquisa dentro de todos os tipos de arquivos, incluindo arquivos binários (fotos, á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
Não funciona porque não há arquivos PHP dentro do diretório atual, mas dentro de alguns subdiretórios do diretório atual, e os nomes dos subdiretórios não terminam com ".php", para que o grep não os procure.
Então, como posso fazer uma pesquisa recursiva no diretório atual, mas também especificando curingas de nome de arquivo? (ou seja: pesquise apenas arquivos que terminam em uma extensão específica)
grep -ir "string" --include="*.php" *
Se você possui uma versão
grep
que não possui a--include
opção, pode usar o seguinte. Ambos foram testados em uma estrutura de diretórios como esta:Onde todos os
.php
arquivos contêm a sequênciastring
.Usar
find
Explicação
Isso encontrará todos os
.php
arquivos e, em seguida, será executadogrep -H string
em cada um deles. Comfind
a-exec
opção,{}
é substituído por cada um dos arquivos encontrados. O-H
dizgrep
para imprimir o nome do arquivo, bem como a linha correspondente.Supondo que você tenha uma versão nova o suficiente
bash
, useglobstar
:Explicação
Conforme explicado no manual do bash :
Portanto, ao executar,
shopt -s globstar
você está ativando o recurso e aglobstar
opção do Bash, que faz a**/*php
expansão para todos os.php
arquivos no diretório atual (**
corresponde a 0 ou mais diretórios, portanto, também**/*php
corresponde./foo.php
) aos quais eles são recebidosstring
.fonte
Usar
*/*.php
Isso torna o grep search um nível de subdiretório
fonte