Este es el comando que estoy intentando ejecutar.
grep -r "printf" *.c
Estoy intentando obtener todas las líneas printf de todos .c
los archivos presentes en mi cwd. A partir de ahora, mi directorio actual es Escritorio y tengo al menos entre 10 y 15 .c
archivos 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á *.c
a todos los archivos/directorios que terminen .c
en su directorio actual; si no existe dicho archivo/directorio, el patrón se tratará literalmente (presumiblemente no lo haya nullglob
configurado).
Como puede ver, su patrón actual nunca va debajo del directorio actual ya que no tiene ningún .c
archivo en el directorio actual o, si hay alguno, no lo tienen printf
, lo que lleva a una salida vacía.
Debe utilizar --include
para buscar solo en archivos selectivos y también -r
para recorrer de forma recursiva:
grep -r --include="*.c" "printf" .
Lo anterior buscará en todos .c
los 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
, cp
o tar
, y no solo grep
):
Set (encender) elshanaoptarion globstar
con 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 Desktop
directorio.
y sus subdirectorios. Entonces puedes usar
grep "printf" **/*.c
para buscar todos los .c
archivos 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
.