Como posso encontrar todos os ficheiros que contêm texto específico no Linux?

I'estou a tentar encontrar uma forma de procurar em todo o meu sistema Linux por todos os ficheiros que contenham uma sequência específica de texto. Apenas para esclarecer, I'm procurando por texto dentro do arquivo, não no nome do arquivo.

Quando estava a pensar em como fazer isto, deparei-me duas vezes com esta solução:

find / -type f -exec grep -H 'text-to-find-here' {} \;

No entanto, não funciona't. Parece exibir todos os arquivos do sistema.

Isto está perto da maneira correcta de o fazer? Se não, como devo fazê-lo? Esta habilidade de encontrar cadeias de texto em arquivos seria extraordinariamente útil para alguns projetos de programação I'm fazendo.

Solução

Faça o seguinte:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r ou -R é recursivo,
  • -n é o número da linha, e *`-w'' significa igualar a palavra inteira.
  • -l (L em minúsculas) pode ser adicionado apenas para dar o nome do arquivo correspondente.

Junto com estas bandeiras, --excluir',--incluir', `--excluir-dir' poderiam ser utilizadas para uma busca eficiente:

  • Isto só irá pesquisar através daqueles ficheiros que têm extensões .c ou .h:

    grep --include=\*.{c,h} -rnw '/caminho/para/em algum lugar/' -e "padrão"
  • Isto excluirá a pesquisa de todos os arquivos que terminem com extensão .o:

    grep --exclude=*.o -rnw '/caminho/para/em algum lugar/' -e "padrão
  • Para diretórios é possível excluir um diretório(s) específico(s) através do parâmetro `--exclude-dir'. Por exemplo, isto irá excluir os dirs dir1/, dir2/ e todos eles combinando *.dst/:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/caminho/para/em algum lugar/' -e "padrão"

Isto funciona muito bem para mim, para alcançar quase o mesmo propósito que o seu.

Para mais opções, verifique man grep.

Comentários (36)

Você pode utilizar grep -ilR:

grep -Ril "text-to-find-here" /
  • I` significa "ignore case" (opcional no seu caso).
  • "R" significa "recursivo".
  • "l" significa "show the file name, not the result itself" (mostrar o nome do arquivo, não o resultado em si).
  • / significa começar pela raiz da sua máquina.
Comentários (29)

Você pode usar ack. É como grep para o código fonte. Você pode escanear todo o seu sistema de arquivos com ele.

Basta fazer:

ack 'text-to-find-here'

No seu diretório raiz.

Você também pode usar expressões regulares, especificar o tipo de arquivo, etc.


**UPDATE***

Eu acabei de descobrir The Silver Searcher, que é como umck mas 3-5x mais rápido que ele e até ignora padrões de um arquivo `.gitignore'.

Comentários (3)