Disfruté de 'grep' durante décadas, pero dejé Linux años después y regresé, encontrando que 'grep' funciona diferente a antes. Verifiqué su uso desde la web y confirmé que mi memoria no está dañada.
Estoy seguro de que algunos archivos *.h
y *.cpp
se encuentran en subdirectorios más profundos. Utilicé los siguientes comandos y obtuve algo similar inesperado:
grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*
obtuve el resultado de
grep: *.h: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c*: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris........svn-base
respectivamente.
- Si usé el comando:,
grep 44738 -r -l .
obtuve el mismo resultado excepto la primera línea degrep: ...
- Si usé el comando:,
grep 44738 -r -l *.c*
simplemente me quedégrep: ...
sin ningún archivo. - Si usé el comando:,
grep 44738 -r -l -file *.c* .
acabo de obtenergrep: *.c*: No such file or directory
El resultado casi va en contra de mi experiencia de hace varios años. Mis preguntas son:
- ¿Ubuntu-18.04.6 tuvo muchos cambios
grep
? - ¿Cómo puedo especificar patrones de archivos en grep? ¿Por qué no puedo usar patrones como
*.c
como*.h
*.c*
lo hice años antes? - Mi compañero de trabajo me sugirió que lo usara
ack
, pero encontré casi lo mismo. ¿Qué comandos debo usar para la búsqueda global de cadenas comogrep
antes?
Respuesta1
Hay dos problemas aquí. Primero, no puede combinar los indicadores -r
o -R
y también dar nombres de archivos de destino como argumentos. -r
/ -R
activa la búsqueda recursiva, lo que significa "buscar en todos los archivos en los directorios dados", por lo que tratarán su grep
argumento como un directorio para buscar archivos. Como no hay ningún directorio cuyo nombre coincida con el *.c*
glob, obtendrá el error espectáculo. Hasta donde puedo recordar, este siempre ha sido el caso, al menos desde que uso Linux, hace ya casi 25 años.
Puedes usar globos como quieras si no usas las banderas -r
/ ,-R
perodebes citarlos, esto es imprescindible. Si no lo cita, como lo hizo, el shell expandirá el globo a cualquier archivo coincidente y grep
no verá el globo, sino solo el resultado de la expansión del shell, por lo que solo cualquier archivo o directorio en el directorio actual cuyos nombres coinciden con el glob.
Ahora, GNU grep
, el valor predeterminado en Linux, tiene una manera de hacer lo que quieras, pero la sintaxis es diferente:
grep 44738 -r -l --include='*.h'
Ver man grep
:
--include=GLOB
Search only files whose base name matches GLOB (using wildcard
matching as described under --exclude). If contradictory
--include and --exclude options are given, the last matching
one wins. If no --include or --exclude options match, a file
is included unless the first such option is --include.