Liste os arquivos contendo uma palavra em particular no texto deles

25

Eu gostaria de listar os arquivos de forma recursiva e exclusiva que contenham a palavra dada.

Exemplo : Verificando a palavra 'check', o normal é grep

$ grep check * -R

Mas como há muitas ocorrências dessa palavra, recebo muita saída. Por isso, só preciso listar os nomes de arquivos que contêm a palavra de pesquisa fornecida. Eu acho que algum truque com find e xargs seria suficiente aqui, mas não tenho certeza.

Alguma idéia?

    
por mtk 18.02.2013 / 13:34

7 respostas

33

Use a opção -l ou --files-with-matches , documentada da seguinte forma:

Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning will stop on the first match. (-l is specified by POSIX.)

Então, para você exemplo, você pode usar o seguinte:

$ grep check * -lR
    
por 18.02.2013 / 13:37
18
find . -type f -exec grep -l check {} +

Você provavelmente não deseja usar a opção -R , que, com as versões modernas do GNU grep , segue os links simbólicos para os diretórios descendentes. Use a opção -r em vez disso, que desde a versão 2.12 (abril de 2012) não segue mais os links simbólicos.

Se o seu grep não é o GNU, ou é mais antigo que a versão 2.12, ou se você precisa que seu código seja portável para sistemas GNU sem borda de ponta, use o comando find acima.

Caso contrário, você pode fazer:

grep -rl check .

Não use * (como isso omitiria arquivos ocultos no diretório atual (e apenas no diretório atual) e causaria problemas para arquivos cujo nome começa com - ), evite passar opções após argumentos como isso não é garantido para trabalhar dependendo do ambiente e não é portátil.

    
por 18.02.2013 / 13:54
1

Tente isto:

find . -type f | xargs grep -c check $1 | grep -v ":0"

Quanto aos grep flags ...

-c retornará um nome de arquivo seguido por: e um número indicando quantas vezes a string de pesquisa aparece no arquivo fornecido.

-v pegará a saída da primeira pesquisa grep , filtrará os arquivos com zero resultados e imprimirá apenas os arquivos com resultados diferentes de zero.

    
por 18.02.2013 / 17:24
0

grep -rin "whatToFind" locationToFInd

por exemplo, $ grep -rin "vihaan".

pesquisará recursivamente e listará os nomes dos arquivos e as linhas correspondentes que contiverem "vihaan", "." refere-se ao diretório atual.

    
por 15.08.2013 / 21:32
0
find . -type f | grep "keyword" *

pesquisa no diretório atual. Para pesquisar a partir da raiz, especifique / em vez de .

    
por 23.02.2015 / 01:36
0

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.

    
por 28.02.2017 / 13:54
-2
 grep -rli trim \' find . -name *.q \' 

Forneça a lista de .q arquivos que contém a palavra-chave trim

    
por 11.02.2015 / 01:10