Como listar arquivos .txt com conteúdo específico?

5

Como faço para listar todos os arquivos .txt com seu caminho completo que tenha uma palavra 'Ubuntu' neles. Ignore os arquivos que não são de texto. Ao comparar os valores, você deve ignorar o caso, ou seja, UBUNTU ou ubuNtu ou UbUnTu são tratados como iguais à frase de pesquisa fornecida.

    
por Sampad Mund 20.02.2018 / 10:51

4 respostas

8

O GNU grep suporta pesquisa recursiva baseada em um padrão glob, por exemplo:

grep --include='*.txt' -ril ubuntu /path/to/dir

Se você não estiver procurando por uma expressão regular, esse processo será muito mais rápido se você incluir uma correspondência de cadeia fixa ( -F ). Outra otimização é remover o caso de ignorar ( -i ) se você sabe que não é necessário.

    
por 20.02.2018 / 10:58
3

Solução simples find + grep :

find . -type f -name "*.txt" -exec grep -li --binary-files=without-match 'ubuntu' {} \;

grep detalhes:

  • l - 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
  • i - ignora as distinções de maiúsculas e minúsculas, de modo que os caracteres que diferem apenas no caso correspondem um ao outro
por 20.02.2018 / 10:55
3

Algumas implementações do utilitário grep possuem um sinalizador -I que faz com que grep ignore arquivos binários. Você também pode usar -i para fazer uma correspondência sem distinção entre maiúsculas e minúsculas e -F para corresponder a uma sequência fixa (em vez de uma expressão regular). Se você está procurando por palavras separadas, você vai querer usar -w que algumas grep implementações tem. Em seguida, para recorrer aos subdiretórios, convém usar -R para pesquisar recursivamente os arquivos e -l para obter os nomes dos arquivos que contêm correspondências do padrão. Então, gostaríamos de usar --include se tivermos o GNU grep para ver apenas arquivos com uma certa extensão.

grep -Fil -IRw --include='*.txt' 'ubuntu' /path/to/top/dir

Opções padrão usadas: -F , -i , -l .

Opções não padrão usadas (suportadas por algumas grep implementações): -w , -I , -R , --include .

Usando find e OpenBSD grep , que não tem --include e que usa --binary-files em vez de -I (o% GNUgrep também tem esse sinalizador):

find /path/to/top/dir -type f -name '*.txt' \
    -exec grep -Fil -w --binary-files=without-match 'ubuntu' {} +
    
por 20.02.2018 / 11:31
1

Isso é o que eu uso normalmente:

find /path/to/top/dir -type f -name '*.txt' -exec grep -iHI ubuntu {} \;
    
por 20.02.2018 / 12:44