¿Por qué no funciona este grep para una cadena en todos los subdirectorios?

¿Por qué no funciona este grep para una cadena en todos los subdirectorios?

Este es el comando que estoy intentando ejecutar.

grep -r "printf" *.c

Estoy intentando obtener todas las líneas printf de todos .clos archivos presentes en mi cwd. A partir de ahora, mi directorio actual es Escritorio y tengo al menos entre 10 y 15 .carchivos en mis subdirectorios en Escritorio, pero este comando no muestra ninguna coincidencia. Entonces, ¿cómo hago para que esto funcione en este caso?

Respuesta1

Si lo haces:

grep -r "printf" *.c

el shell se expandirá *.ca todos los archivos/directorios que terminen .cen su directorio actual; si no existe dicho archivo/directorio, el patrón se tratará literalmente (presumiblemente no lo haya nullglobconfigurado).

Como puede ver, su patrón actual nunca va debajo del directorio actual ya que no tiene ningún .carchivo en el directorio actual o, si hay alguno, no lo tienen printf, lo que lleva a una salida vacía.

Debe utilizar --includepara buscar solo en archivos selectivos y también -rpara recorrer de forma recursiva:

grep -r --include="*.c" "printf" .

Lo anterior buscará en todos .clos archivos la cadena (patrón) printf, recursivamente comenzando desde el directorio actual.

si quieres seguir todos los enlaces simbólicos:

grep -R --include="*.c" "printf" .

Respuesta2

Si desea saber por qué su comando no funciona, consultela otra respuesta. Si quieres saber cómo hacerlo funcionar, aquí tienes otro enfoque (copiado de Grep en archivos con una extensión específica en un directorio con localizaciones cosméticas) que utiliza las capacidades de bash en lugar de las capacidades de grep (y por lo tanto funcionará para cualquier comando, como wc, cpo tar, y no solo grep):

Set (encender) elshanaoptarion globstarcon el comando

shopt -s globstar

Esto hará **que un componente de nombre de archivo signifique todo lo que aparece aquí y abajo. Entonces, si estás en Desktop, **significa todo lo que está en el Desktopdirectorio. y sus subdirectorios. Entonces puedes usar

grep "printf" **/*.c

para buscar todos los .carchivos dentro y debajo de Desktop. No necesita especificar -r, porque el shell hace la recursividad por usted, y no necesita especificar --include, porque el patrón de expansión del nombre de ruta (también conocido como glob o comodín) contiene *.c.


Puedetunset opciones con shopt -u.

información relacionada