it-swarm.dev

grep, pero solo ciertas extensiones de archivo

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

Quiero grep solo .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 protected]

¿Puede alguien mostrarme cómo agregaría ahora solo las extensiones de archivo específicas?

798
Jason

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

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

eso debería hacer lo que quieras.

Notas de sintaxis:

  • -r - buscar recursivamente
  • -i - case - insensitive search
  • --include=\*.${file_extension} - busque archivos que coincidan con la extensión (es) o el patrón de archivo solamente
1110
Nelson

Algunas de estas respuestas parecían demasiado pesadas en la sintaxis, o produjeron problemas en mi servidor Debian. Esto funcionó perfectamente para mí:

PHP Revolución: ¿Cómo copiar archivos en Linux, pero solo ciertas extensiones de archivo?

A saber:

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

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

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

  • -r: recursivamente

  • -i: ignore-case

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

  • 'searchterm': Qué buscar

  • ./: Comience en el directorio actual.

234
HoldOffHunger

Qué tal si:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
47
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
43
Yuri Malov

No hay opción -r en los servidores HP y Sun, de esta manera me funcionó en mi servidor HP

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

-i es para la búsqueda insensible de la cadena

15
Sam B

Como se trata de encontrar archivos, ¡usemos find!

Usando GNU encuentra que puede usar la opción -regex para encontrar esos archivos en el árbol de directorios cuya extensión es .h o .cpp:

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

Entonces, es solo una 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 hallazgos, debe usar un enfoque como Amir Afghani's , usar -o para concatenar opciones ( el nombre termina 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}
#                      ^^^^^^^^^^^^^^^^^^^
11
fedorqui

La forma más fácil es

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

Soy consciente de que esta pregunta es un poco anticuada, pero me gustaría compartir el método que normalmente utilizo para encontrar .do.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
Tom

Debajo de la respuesta es buena.

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

Pero se puede actualizar a:

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

Lo que puede ser más simple.

2
hao

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
Eldamir

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

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

O agruparlos por ()

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

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

1
where23