linux - texto - grep, pero solo ciertas extensiones de archivo
grep linux (11)
Algunas de estas respuestas parecían tener demasiada sintaxis, o produjeron problemas en mi servidor Debian. Esto funcionó perfectamente para mí:
Revolución de PHP: ¿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
: ignorar-caso--include
: todos los archivos de texto * .txt: (escape con / solo en caso de que tenga un directorio con asteriscos en los nombres de archivo)''searchterm''
: Qué buscar./
: Comience en el directorio actual.
Estoy trabajando en escribir algunos scripts para grep
ciertos directorios, pero estos directorios contienen todo tipo de tipos 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]
¿Alguien me puede mostrar cómo agregaría ahora solo las extensiones de archivo específicas?
Como se trata de encontrar archivos, ¡usemos find
!
Usando GNU find, 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 utilizar un enfoque como el de Amir Afghani , usando -o
para concatenar las opciones ( el nombre termina con .h
o con .cpp
):
find -type f /( -name ''*.h'' -o -name ''*.cpp'' /) -exec grep "your pattern" {} +
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Y si realmente desea usar grep
, siga la sintaxis indicada para: --include
:
grep "your pattern" -r --include=*.{cpp,h}
# ^^^^^^^^^^^^^^^^^^^
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.
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" {} /;
Opción ''-Hn'' muestra el nombre del archivo y la línea.
La forma más fácil es
find . -type f -name ''*.extension'' | xargs grep -i string
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
Qué tal si:
find . -name ''*.h'' -o -name ''*.cpp'' -exec grep "CP_Image" {} /; -print
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
- búsqueda de mayúsculas y minúsculas -
--include=/*.${file_extension}
- busca archivos que coincidan con la extensión (es) o patrón de archivo solamente
Soy consciente de que esta pregunta es un poco anticuada, pero me gustaría compartir el método que normalmente utilizo para encontrar los archivos .c y .h :
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"
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>
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./