Grep recursivo falla para archivos * .c

13

Traté de buscar de forma recursiva un patrón en todos los archivos .c de la siguiente manera

> grep -lr search-pattern *.c

Pero obtuve esto como salida

> grep: *.c: No such file or directory

Cuando uso esto:

> grep -lr search-pattern *

Tengo mucho. c archivos en los directorios con el patrón.

¿Qué hay de malo con la expresión anterior?

Arrendajo
fuente

Respuestas:

22

Sugiero usar la --includeopción de grep:

grep -lr --include='*.c' search-pattern .
enzotib
fuente
1
+1. No conocía la --include=GLOBopción. En combinación con la opción recursiva, esto es muy poderoso y no requiere find. ¡Agradable!
gertvdijk
Tarde a la fiesta aquí, pero estoy confundido acerca de para qué .sirve el final del comando.
Nathan Jones
1
@NathanJones: grep requiere uno o más nombres de archivo o directorios en los que buscar. El punto dice: buscar en el directorio actual
enzotib
3

El *.cpatrón es evaluado por su shell. Se aplica al directorio actual, tal como lo usaría ls *.c.

Creo que lo que quieres es encontrar todos los archivos que coincidan con el *.cpatrón (recursivamente) y grepbuscarte en él. Aquí hay una manera de hacer eso:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

Se utiliza xargspara agregar los resultados de búsqueda por find.


Alternativamente, use la -execopción para buscar, por ejemplo:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

Además, no estoy seguro de si realmente quieres la -lopción grep. Se detendrá en el primer partido:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)
gertvdijk
fuente
La find/xargssintaxis se rompe en los nombres de archivo que contienen espacios. La -Lopción de grepdetenerse en la primera coincidencia de cada archivo y continuar con el siguiente archivo: si uno solo quiere ver si el patrón está contenido al menos una vez en cada archivo dado, es más rápido.
enzotib
@enzotib Gracias, lo arreglé usando la -print0opción y xargs --null.
gertvdijk
-1

Sé que este es un hilo bastante antiguo, pero como tenía la misma pregunta, quiero compartir mi forma preferida de lograr lo mismo, en una forma mucho más corta.

ls | grep "file.*.c"
Jebiel
fuente
2
La pregunta se trata de buscar un patrón, no de buscar un archivo.
Jay