Pregunta grep, pero solo ciertas extensiones de archivos


Estoy trabajando en escribir algunos guiones para grep ciertos directorios, pero estos directorios contienen todo tipo de tipos de archivos.

quiero grep sólo .h y .cpp por ahora, pero tal vez algunos otros en el futuro.

Hasta ahora tengo:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP email@domain.com

¿Alguien puede mostrarme cómo agregaría solo las extensiones de archivo específicas?


649
2017-09-20 16:30


origen


Respuestas:


Solo usa el --include parámetro, como este:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

eso debería hacer lo que quieras.

Notas de sintaxis:

  • -r - buscar recursivamente
  • -i - caso-insensible buscar
  • --include=\*.${file_extension} - buscar archivos que coincidan con la (s) extensión (es) o solo el patrón de archivo

910
2017-09-20 16:35



Algunas de estas respuestas parecían demasiado pesadas en sintaxis o producían problemas en mi Servidor Debian. Esto funcionó perfectamente para mí.

grep -r --include=\*.txt 'searchterm' ./

... o versión insensible a mayúsculas / minúsculas ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: comando

  • -r: recursivamente

  • -i: ignorar caso

  • --include: todos * .txt: archivos de texto (escape con \ solo en caso de que tenga un directorio con asteriscos en los nombres de archivos)

  • 'searchterm': Qué buscar

  • ./: Comience en el directorio actual.


183
2018-02-08 22:46



Qué tal si:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

44
2017-09-20 16:33



grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./

38
2017-07-23 19:38



No hay opción -r en servidores HP y Sun, de esta manera funcionó para mí en mi servidor HP

find . -name "*.c" | xargs grep -i "my great text"

-i es para búsqueda de cadena insensible a mayúsculas y minúsculas


12
2017-12-11 15:14



Dado que esto es una cuestión de hallazgo archivos, vamos a usar find!

Usando GNU find puedes usar el -regex opción para encontrar esos archivos en el árbol de directorios cuya extensión es cualquiera .h o .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

Entonces, solo es cuestión de ejecutar grep en cada uno de sus resultados:

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

Si no tiene esta distribución de encontrar, tiene que usar un enfoque como Amir Afghani, utilizando -o para concatenar opciones (el nombre está terminando con .h o con .cpp)

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Y si realmente quieres usar grep, sigue la sintaxis indicada para --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

7
2017-08-17 09:24



Soy consciente de que esta pregunta está un poco anticuada, pero me gustaría compartir el método que normalmente uso para encontrar .do y .h archivos:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

o si necesita el número de línea también:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"

3
2018-03-13 11:17



La forma más fácil es

find . -type  f -name '*.extension' | xargs grep -i string 

3
2018-02-05 17:30



ag (el buscador de plata) tiene una sintaxis bastante simple para esto

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

asi que

ag -G *.h -G *.cpp CP_Image <path>

2
2018-05-10 13:57



A continuación la respuesta es buena.

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

Pero se puede actualizar a:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com

Que puede ser más simple.


1
2018-01-31 02:37



Debería escribir "-exec grep" para cada "-o-nombre"

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

O agrúpelos por ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

la opción '-Hn' muestra el nombre y la línea del archivo.


0
2017-11-10 02:09