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

Respuestas:



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.



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.


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.