Eu gostaria de listar os arquivos recursiva e exclusivamente que contêm a palavra dada.
Exemplo : Checando a palavra “verificar”, normalmente faço um grep
$ grep check * -R
Mas como há muitas ocorrências dessa palavra, obtenho muitos resultados. Portanto, só preciso listar os nomes de arquivo que contêm a palavra de pesquisa fornecida. Acho que algum truque com find
e xargs
seria suficiente aqui, mas não tenho certeza.
Alguma ideia?
Resposta
Use -l
ou --files-with-matches
opção documentada da seguinte maneira:
Suprime a saída normal; em vez disso, imprima o nome de cada arquivo de entrada do qual a saída normalmente teria sido impressa. A varredura será interrompida na primeira partida. (
-l
é especificado por POSIX.)
Portanto, para seu exemplo, você pode usar o seguinte:
$ grep check * -lR
Comentários
Resposta
find . -type f -exec grep -l check {} +
Você provavelmente não quer usar a opção -R
que com versões modernas do GNU grep
segue links simbólicos ao descer diretórios. Use a opção -r
, que desde a versão 2.12 (abril de 2012) não segue mais links simbólicos.
Se o seu grep não for GNU, ou for anterior à versão 2.12, ou se você precisa que seu código seja portável para sistemas GNU não avançados, use o find
comando acima.
Caso contrário, você pode fazer:
grep -rl check .
Não use *
(pois isso omitiria arquivos ocultos no diretório atual (e apenas no diretório atual) e causaria problemas para arquivos cujo nome comece com -
), evite passar opções após argumentos, pois isso não é garantido precisam funcionar dependendo do ambiente e não é portátil.
Resposta
Tente isto:
find . -type f | xargs grep -c check $1 | grep -v ":0"
Quanto aos grep
sinalizadores …
-c
irá retorna um nome de arquivo seguido por: e um número indicando quantas vezes a string de pesquisa aparece no arquivo fornecido.
-v
obterá a saída do primeiro grep
pesquise, filtre os arquivos com resultados zero e imprima apenas os arquivos com resultados diferentes de zero.
Comentários
- Isso obterá um falso negativo se você tiver arquivo (s) (ou diretor (es)) cujos nomes contenham
:0
. É ' melhor fazergrep -v ':0$'
. Mesmo isso irá bloquear os nomes de caminho que contêm novas linhas.
Resposta
grep -lR "text-to-find" <where-to-find>
também funciona bem.
por exemplo, grep -lR "NAVIGATE" .
onde encontramos a palavra NAVIGATE
no .
no diretório atual.
Resposta
grep -rin “whatToFind” locationToFInd
por exemplo, $ grep -rin “vihaan”.
irá pesquisar e listar recursivamente os nomes dos arquivos e as linhas correspondentes que contenham “vihaan”, “.” refere-se ao diretório atual.
Resposta
find . -type f | grep "keyword" *
pesquise no diretório atual. Para pesquisar na raiz, especifique /
em vez de .
Resposta
grep -rli trim \` find . -name *.q \`
Fornece a lista de .q
arquivos que contêm a palavra-chave trim
grep -rl "text to find" "/usr/share"
e funcionou muito bem!