Grep en archivos con una extensión específica en un directorio

11

¿Existe un comando que permita buscar una palabra clave en archivos en un directorio con extensión específica?

La cadena grep -irn "string" ./pathofrece una búsqueda recursiva de todos los archivos del directorio ./path. Mi requisito específico es buscar en todos los archivos ./pathcon una extensión como*.h

Ginu Jacob
fuente

Respuestas:

11

Después de algunas pruebas, creo que grep -irn 'string' --include '*.h'es más útil

Ginu Jacob
fuente
1
Si vas a hacer eso, asegúrate de poner las "*.h"comillas.
G-Man dice 'reinstalar a Monica' el
Funciona con y sin comillas
Ginu Jacob
3
Ahora lo hace Intente crear un archivo llamado foobar.hen el directorio actual e inténtelo de nuevo.
G-Man dice 'reinstalar a Monica' el
10

S et (activar) la sh ell opt ion globstarcon el comando

    shopt -s globstar

Esto hará **que un componente de nombre de archivo signifique todo aquí y debajo. Entonces path/**significa todo en el pathdirectorio y sus subdirectorios . (No necesita escribir ./aquí). Luego puede usar

grep -in "string" path/**/*.h

para buscar todos los .harchivos en y debajo path.


Puede u NSET con opciones shopt -u.

G-Man dice 'restablecer a Mónica'
fuente
5
find /path -iname "*.h" -exec grep -inH "string" "{}" \;
Ipor Sircer
fuente
1
-exec... también +es bueno.
G-Man dice 'reinstalar a Monica' el
1
Me acabo de dar cuenta: ¡olvidó incluirlo "string"en su respuesta!
G-Man dice 'reinstalar a Monica' el
3

Si puede instalar algo en su máquina, sugiero usar ack .

Puede hacer exactamente lo que necesita con él y mucho más. Para su caso de uso, puede hacer:

# Depending of your system, you have to use one or the other
ack --hh -i string path
ack-grep --hh -i string path
  • --hh filtra en archivos h
  • -i ignora el caso

Para encontrar qué filtros de archivos son compatibles de forma nativa, ejecute el comando ack --help=type.

ANUNCIO
fuente
También hay ag , un antiguo clon de ack. Primero, porque sus conjuntos de características han divergido algo.
8bittree
No conocía ag. Gracias por compartir.
AD
3

¿Qué hay de este?

find -L ./path -name "*.h" -exec grep -in "string" {} \;

Explicación:

  • -L: sigue enlaces simbólicos
  • -name: usando el asterisco, puedes describir extensiones
  • -in: igual que su propuesta, pero la 'r' se reemplaza por el findcomando
  • {}: esto representa el resultado del findcomando
  • \; : En caso de que se combina findcon -exec, este es el especificador de fin de comando
Dominique
fuente
1
Como "*.h"funciona Pensé que tenía que ser así'*.h'
Joe
Siempre trabajo con comillas dobles, no creo que haga la diferencia.
Dominique
0

Si está utilizando gnu grep, entonces tiene una bandera que hace exactamente lo que quiere:

grep -irn --include=\*.h "string" path

aunque no creo que esté disponible en otros greps.

plnu
fuente