Estoy trabajando en escribir algunos scripts en 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 puede mostrarme cómo agregaría ahora solo las extensiones de archivo específicas?
grep -r -i CP_Image ~/path1/*.{h,cpp}
?ag -i CP_Image ~/path[1-5] | mailx -s GREP [email protected]
. Trabajo hecho.-r
agrep
tener que buscar archivos como que rompe el mantra UNIX de contar con herramientas que "hacer una cosa y hacerlo bien". Hay una herramienta perfectamente buena para encontrar archivos con un nombre MUY obvio.Respuestas:
Simplemente use el
--include
parámetro, así:eso debería hacer lo que quieras.
Para tomar la explicación de la respuesta de HoldOffHunger a continuación:
grep
: comando-r
: recursivamente-i
: ignorar caso--include \*.cpp
: todos * .cpp: archivos C ++ (escape con \ solo en caso de que tenga un directorio con asteriscos en los nombres de archivo)./
: Comience en el directorio actual.fuente
grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
grep -r -i --include="*.h" --include="*.cpp" CP_Image
Algunas de estas respuestas parecían demasiado cargadas de sintaxis o producían problemas en mi servidor Debian. Esto funcionó perfectamente para mí:
Revolución PHP: ¿Cómo Grep archivos en Linux, pero solo ciertas extensiones de archivo?
A saber:
... o versión que no distingue entre mayúsculas y minúsculas ...
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 archivo)'searchterm'
: Qué buscar./
: Comience en el directorio actual.fuente
*
uso de\*.cpp
o'*.cpp'
. De lo contrario, no dará el resultado esperado cuando el directorio de trabajo contenga algunos*.txt
archivos.--include=<pattern>
pero es importante escapar*
con--include <pattern>
(un espacio en lugar de=
) que de lo contrario se siente muy similar.fuente
--include
opción después de la aguja, no con otras opciones?--
?Qué tal si:
fuente
-name
argumentos. cosas extrañas pueden suceder si no lo haces.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
find
opcionalmente puede agrupar argumentos, reduciendo al mínimo las invocaciones del proceso llamado.find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} +
Esto se sugiere pero no se destaca en la respuesta de @ fedorqui a continuación y es una mejora que vale la pena. El-H
argumento para grep aquí es útil cuando find solo identifica un único archivo coincidente. Esto podría eliminar el uso de-print
en la respuesta. Si su lista total de archivos es lo suficientemente pequeña,{path1,path2}/**/*.{cpp,h}
puede ser preferible usar un globo de shell recursivo (por ejemplo ).No hay una opción -r en los servidores HP y Sun, de esta manera funcionó para mí en mi servidor HP
-i es para búsqueda de cadena sin distinción entre mayúsculas
fuente
ll
pero no se agrega--color=auto
a grep.Como se trata de encontrar archivos,
find
¡ usemos !Con GNU find puede usar la
-regex
opción para buscar esos archivos en el árbol de directorios cuya extensión es.h
o.cpp
:Entonces, solo es cuestión de ejecutar
grep
cada uno de sus resultados:Si no tiene esta distribución de hallazgo, debe usar un enfoque como el de Amir Afghani , usar
-o
para concatenar opciones ( el nombre termina con.h
o con.cpp
):Y si realmente quiere usar
grep
, siga la sintaxis indicada para--include
:fuente
La forma más fácil es
fuente
ag
(el buscador plateado) tiene una sintaxis bastante simple para estoentonces
fuente
ag _string_to_find_ -G _filename_regex_
La siguiente respuesta es buena:
Pero se puede actualizar a:
Que puede ser más simple.
fuente
Debería escribir "-exec grep" para cada "-o -name"
O agrúpelos por ()
La opción '-Hn' muestra el nombre del archivo y la línea.
fuente
Soy consciente de que esta pregunta está un poco anticuada, pero me gustaría compartir el método que normalmente uso para encontrar archivos .c y .h :
o si necesita el número de línea también:
fuente