¿Qué hay de malo con el comando 'grep' en Ubuntu-18.04.6?

¿Qué hay de malo con el comando 'grep' en Ubuntu-18.04.6?

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 *.hy *.cppse 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:

  1. ¿Ubuntu-18.04.6 tuvo muchos cambios grep?
  2. ¿Cómo puedo especificar patrones de archivos en grep? ¿Por qué no puedo usar patrones como *.ccomo *.h *.c*lo hice años antes?
  3. 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 como grepantes?

Respuesta1

Hay dos problemas aquí. Primero, no puede combinar los indicadores -ro -Ry también dar nombres de archivos de destino como argumentos. -r/ -Ractiva la búsqueda recursiva, lo que significa "buscar en todos los archivos en los directorios dados", por lo que tratarán su grepargumento 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/ ,-Rperodebes citarlos, esto es imprescindible. Si no lo cita, como lo hizo, el shell expandirá el globo a cualquier archivo coincidente y grepno 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.

información relacionada