O que há de errado com o comando ‘grep’ no Ubuntu-18.04.6?

O que há de errado com o comando ‘grep’ no Ubuntu-18.04.6?

Eu gostei do 'grep' por décadas, mas deixei o Linux anos depois e voltei, descobrindo que o 'grep' funciona diferente de antes. Verifiquei seu uso na web e confirmei que minha memória não está corrompida.

Tenho certeza de que alguns *.harquivos *.cppestão em subdiretórios mais profundos. Usei os comandos abaixo e obtive resultados semelhantes inesperados:

grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*

Eu obtive 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.

  • Se eu usei o comando: grep 44738 -r -l ., obtive o mesmo resultado, exceto a primeira linha dogrep: ...
  • Se eu usei o comando: grep 44738 -r -l *.c*, fiquei grep: ...sem nenhum arquivo.
  • Se eu usei o comando: grep 44738 -r -l -file *.c* ., acabei de recebergrep: *.c*: No such file or directory

O resultado é quase contrário à minha experiência de vários anos atrás. Minhas perguntas são:

  1. O ubuntu-18.04.6 teve muitas mudanças grep?
  2. Como posso especificar padrões de arquivo no grep? Por que não posso usar padrões como *.c, *.h *.c*como fiz anos antes?
  3. Meu colega de trabalho sugeriu que eu usasse ack, mas encontrei quase a mesma coisa. Quais comandos devo usar para pesquisa global de strings como grepantes?

Responder1

Há duas questões aqui. Primeiro, você não pode combinar os sinalizadores -rou -Re também fornecer nomes de arquivos de destino como argumentos. O -r/ -Rativa a pesquisa recursiva, que significa "pesquisar todos os arquivos nos diretórios fornecidos", para que eles tratem grepseu argumento como um diretório para procurar arquivos. Como não há nenhum diretório cujo nome corresponda ao *.c*glob, você obtém o erro que você mostrar. Pelo que me lembro, sempre foi assim, pelo menos desde que uso Linux, há quase 25 anos.

Você pode usar globs como quiser se não usar os sinalizadores -r/ ,-Rmasvocê deve citá-los, isso é essencial. Se você não citá-lo, como fez, o glob será expandido pelo shell para quaisquer arquivos correspondentes e grepnão verá o glob, mas apenas o resultado da expansão do shell, portanto, apenas quaisquer arquivos ou diretórios no diretório atual cujos nomes correspondem ao glob.

Agora, GNU grep, o padrão no Linux, tem uma maneira de fazer o que você quiser, mas a sintaxe é 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.

informação relacionada