Listar os arquivos que contêm uma palavra específica em seu texto

30

Gostaria de listar os arquivos de forma recursiva e exclusiva que contêm a palavra especificada.

Exemplo : Verificando a palavra 'check', normalmente faço é um grep

$ grep check * -R

Mas como existem muitas ocorrências dessa palavra, recebo muita saída. Então, eu só preciso listar os nomes de arquivos que contêm a palavra de pesquisa especificada. Eu acho que algum truque com finde xargsseria suficiente aqui, mas não tenho certeza.

Alguma ideia?

mtk
fonte

Respostas:

39

Use a opção -lou --files-with-matchesque está documentada da seguinte maneira:

Suprimir saída normal; em vez disso, imprima o nome de cada arquivo de entrada do qual a saída normalmente seria impressa. A digitalização será interrompida na primeira partida. ( -lé especificado pelo POSIX.)

Portanto, para seu exemplo, você pode usar o seguinte:

$ grep check * -lR
NN
fonte
Funciona em MSYS também. Ótimo!
Kos
2
Eu usei grep -rl "text to find" "/usr/share"e funcionou muito bem!
Shrout1
18
find . -type f -exec grep -l check {} +

Você provavelmente não deseja usar a -Ropção que, nas versões modernas do GNU, grepsegue links simbólicos ao descer diretórios. Use a -ropção ali, que desde a versão 2.12 (abril de 2012) não segue mais links simbólicos.

Se o seu grep não for o GNU, ou for anterior à versão 2.12, ou se você precisar que seu código seja portátil para sistemas GNU sem borda externa, use o findcomando acima.

Caso contrário, você pode fazer:

grep -rl check .

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

Stéphane Chazelas
fonte
1

Tente o seguinte:

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

Quanto às grepbandeiras ...

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

-vcoletará a saída da primeira greppesquisa, filtrará os arquivos com zero resultados e imprimirá apenas os arquivos com resultados diferentes de zero.

brightwellcd
fonte
Isso será falso negativo se você tiver arquivo (s) (ou diretor (es)) cujos nomes contenham :0. É melhor fazer grep -v ':0$'. Até isso sufocará em nomes de caminho que contenham nova linha (s).
Scott
0

grep -rin "whatToFind" locationToFInd

por exemplo, $ grep -rin "vihaan".

irá procurar e listar recursivamente os nomes dos arquivos e as linhas correspondentes que contêm "vihaan" neles "." refere-se ao diretório atual.

Vihaan Verma
fonte
0
find . -type f | grep "keyword" *

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

Maniraja Jorige
fonte
0

grep -lR "text-to-find" <where-to-find> também funciona bem.

por exemplo, grep -lR "NAVIGATE" .onde encontramos a palavra NAVIGATEno .diretório atual.

imsrgadich
fonte
-2
 grep -rli trim \` find . -name *.q \` 

A lista de .qarquivos contém a palavra-chavetrim

Mithun
fonte