Pregunta Encuentra palabras en muchos archivos


Estoy buscando esto struct messages_sdd_t y necesito buscar a través de una gran cantidad de archivos * .c para encontrarlo. Sin embargo, no puedo encontrar una coincidencia, ya que quiero excluir todas las palabras 'struct' y 'messages_sdd_t'. Como quiero buscar en esto solo 'struct messages_sdd_t' La razón para esto es que, como struct, se usa muchas veces y sigo obteniendo páginas o resultados de búsqueda.

He estado haciendo esto sin éxito:

find . -type f -name '*.c' | xargs grep 'struct messages_sdd_t'

y esto

find . -type f -name '*.c' | xargs egrep -w 'struct|messages_sdd_t'

Muchas gracias por las sugerencias,


2


origen




Respuestas:


Utilizar ack:

ack "struct messages_sdd_t" * .c

Es recursivo por defecto y es mucho más rápido que grep (de acuerdo con mi observación) al buscar a través de un directorio que contiene toneladas de código fuente.

Si no quieres usar ack, grep debería estar bien también:

grep -r "struct messages_sdd_t" * .c


5



Definitivamente +1 por hacerme comprender, después de todos esos largos años, que grep tiene una opción -r ... - DevSolar
"grep -r" es una muy buena respuesta. El problema con find | xargs es que si hay muchos archivos, recibirá un mensaje de error de "lista de argumentos demasiado larga". Puede usar el modificador -n para xargs para evitar esto, pero luego debe establecer el interruptor -H para grep para asegurarse de que prefija el nombre del archivo. Hay una ventaja de utilizar "find | xargs" en lugar de "grep -r": puede hacer un filtro arbitrario para los archivos que desea buscar. - petersohn
Ack reconoce C como un tipo de archivo. Use "ack 'struct messages_sdd_t' --cc", y encontrará todos los archivos C, incluidos los archivos de cabecera .h. - Andy Lester
@petersohn: xargs no falla de esta manera. Utiliza el valor del sistema de la longitud máxima del argumento y divide en consecuencia. correr xargs --show-limits para ver lo que usa en su sistema específico. Si uno necesita usar find, también es bueno ver el -exec command {} + construir en el manual que emulará más o menos xargs directamente en el comando find, con el menor número posible de invocaciones de subprocesos. - Daniel Andersson
@ ant2009: la respuesta dada es incorrecta ya que no buscar recursivamente cuando se le den nombres de archivos como argumentos como este. Solo buscará a través del .c archivos en el directorio actual, no directorios secundarios. - Daniel Andersson


find . -type f -name '*.c' -exec grep 'struct\s\+messages_sdd_t' {} \;

O si solo te importa el nombre del archivo:

find . -type f -name '*.c' -exec grep -q 'struct\s\+messages_sdd_t' {} \; -print

1



en este caso xargs podría ser mejor que -exec; -exec generará un proceso grep para cada archivo. - quack quixote
No, el ejecutivo no hace eso - {} \; hace. Si utiliza {} +, varios archivos serán procesados ​​por un único proceso grep. - DevSolar
Qué tal si grep -l en lugar de grep -q -print? - DevSolar


grep -R --include='*.c' 'struct messages_sdd_t' .

Esto buscará recursivamente y usará grep para elegir solo .c archivos.

Considera agregar -H escribir siempre el nombre del archivo con la coincidencia de línea.


1