Cuando quiero realizar una búsqueda grep recursiva en el directorio actual, generalmente hago:
grep -ir "string" .
Pero ese comando busca dentro de todo tipo de archivos, incluidos los archivos binarios (imágenes, audio, video, etc.), lo que resulta en un proceso de búsqueda muy lento.
Si hago esto, por ejemplo, no funciona:
grep -ir "string" *.php
No funciona porque no hay archivos PHP dentro del directorio actual, sino dentro de algunos de los subdirectorios en el directorio actual, y los nombres de los subdirectorios no terminan con ".php", por lo que grep no mira dentro de ellos.
Entonces, ¿cómo puedo hacer una búsqueda recursiva desde el directorio actual pero también especificando comodines de nombre de archivo? (es decir: solo busca en archivos que terminan en una extensión específica)

grep -ir "string" --include="*.php" *Si tiene una versión
grepque carece de la--includeopción, puede usar lo siguiente. Ambos fueron probados en una estructura de directorios como esta:Donde todos los
.phparchivos contienen la cadenastring.Utilizar
findExplicación
Esto encontrará todos los
.phparchivos y luego se ejecutarágrep -H stringen cada uno de ellos. Confindla-execopción 's ,{}se reemplaza por cada uno de los archivos encontrados. Le-Hindicagrepque imprima el nombre del archivo y la línea coincidente.Suponiendo que tiene una versión suficientemente nueva de
bash, useglobstar:Explicación
Como se explica en el manual de bash :
Entonces, al ejecutar
shopt -s globstar, está activando la función y laglobstaropción de Bash que hace que se**/*phpexpanda a todos los.phparchivos en el directorio actual (**coincide con 0 o más directorios, también**/*phpcoincide./foo.php) que luego se seleccionanstring.fuente
Utilizar
*/*.phpEsto hace que grep search sea un nivel de subdirectorio
fuente