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 *.h
arquivos *.cpp
estã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*
, fiqueigrep: ...
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:
- O ubuntu-18.04.6 teve muitas mudanças
grep
? - 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? - Meu colega de trabalho sugeriu que eu usasse
ack
, mas encontrei quase a mesma coisa. Quais comandos devo usar para pesquisa global de strings comogrep
antes?
Responder1
Há duas questões aqui. Primeiro, você não pode combinar os sinalizadores -r
ou -R
e também fornecer nomes de arquivos de destino como argumentos. O -r
/ -R
ativa a pesquisa recursiva, que significa "pesquisar todos os arquivos nos diretórios fornecidos", para que eles tratem grep
seu 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
/ ,-R
masvocê deve citá-los, isso é essencial. Se você não citá-lo, como fez, o glob será expandido pelo shell para quaisquer arquivos correspondentes e grep
nã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.