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
grep
que carece de la--include
opción, puede usar lo siguiente. Ambos fueron probados en una estructura de directorios como esta:Donde todos los
.php
archivos contienen la cadenastring
.Utilizar
find
Explicación
Esto encontrará todos los
.php
archivos y luego se ejecutarágrep -H string
en cada uno de ellos. Confind
la-exec
opción 's ,{}
se reemplaza por cada uno de los archivos encontrados. Le-H
indicagrep
que 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 laglobstar
opción de Bash que hace que se**/*php
expanda a todos los.php
archivos en el directorio actual (**
coincide con 0 o más directorios, también**/*php
coincide./foo.php
) que luego se seleccionanstring
.fuente
Utilizar
*/*.php
Esto hace que grep search sea un nivel de subdirectorio
fuente