Estoy trabajando en escribir algunos scripts en grepciertos directorios, pero estos directorios contienen todo tipo de tipos de archivos.
Quiero grepsolo .hy .cpppor 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.-ragreptener 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
--includepará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_ImageAlgunas 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\*.cppo'*.cpp'. De lo contrario, no dará el resultado esperado cuando el directorio de trabajo contenga algunos*.txtarchivos.--include=<pattern>pero es importante escapar*con--include <pattern>(un espacio en lugar de=) que de lo contrario se siente muy similar.fuente
--includeopción después de la aguja, no con otras opciones?--?Qué tal si:
fuente
-nameargumentos. cosas extrañas pueden suceder si no lo haces.find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -printfindopcionalmente 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-Hargumento para grep aquí es útil cuando find solo identifica un único archivo coincidente. Esto podría eliminar el uso de-printen 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
llpero no se agrega--color=autoa grep.Como se trata de encontrar archivos,
find¡ usemos !Con GNU find puede usar la
-regexopción para buscar esos archivos en el árbol de directorios cuya extensión es.ho.cpp:Entonces, solo es cuestión de ejecutar
grepcada uno de sus resultados:Si no tiene esta distribución de hallazgo, debe usar un enfoque como el de Amir Afghani , usar
-opara concatenar opciones ( el nombre termina con.ho 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