Listando arquivos que contém determinado padrão recursivamente dentro de um diretório

Publicado por Francisco Ambrozio em 09/06/2009

[ Hits: 14.844 ]

Blog: http://franciscoambrozio.wordpress.com

 


Listando arquivos que contém determinado padrão recursivamente dentro de um diretório



Certo dia, em meu local de trabalho, surgiu a necessidade de realizarmos a troca de certas palavras por outras em todos os arquivos de um diretório e seus sub-diretórios que contivessem as referidas palavras.

Bom, o que fazer para saber quais arquivos contém a palavra que quero? "Maravilha, vou usar o grep e beleza!". Pois é, o grep é sim a solução mais lógica para resolver este problema, mas...

Neste mesmo caso que citei, usando "grep -R palavra", a partir do diretório em que eu queria buscar resultou-me em uma saída "grandinha", digamos.

"Ótimo", pensei, "vou jogar a saída em um arquivo texto e depois analiso o que gerou."

grep -R palavra . > arquivo-saida-grep.txt

E o resultado é que o comando demorou uma eternidade, quase fritou um dos processadores (tá bom, é exagero :)) e me gerou um arquivo de míseros 15G!

Mas, "não contavam com minha astúcia"! Analisando mais friamente a saída gerada, primeiro pude perceber que o retorno do grep é:

arquivo: linha que o grep achou o que você pediu para procurar

Também notei que, se ouve mais de uma ocorrência de palavra no mesmo arquivo, o arquivo será listado quantas vezes houverem tais ocorrências.

Bingo! Uns "comandinhos" a mais e matei a charada. ;)

E aí está, sem mais delongas, o comando para listar todos os arquivos que contém determinado padrão recursivamente dentro de um diretório:

grep -R padrão . 2> /dev/null | cut -f 1 -d ":" | uniq

Onde:
  • grep -R padrão . - quer dizer: "Procure pelo padrão padrão em todos os arquivos a partir deste diretório!";
  • 2> /dev/null - em caso de erros, não será exibido - se houvesse erro de permissão negada, por exemplo, haveria um falso positivo, pois o diretório onde gerou o erro estaria listado como se houvesse sido encontrado padrão;
  • cut -f 1 -d ":" - aqui usamos nosso amigo cut para filtrarmos a saída gerada, obtendo apenas o primeiro campo (-f 1) separado pelo delimitador "dois pontos" (-d ":");
  • uniq - por fim, o uniq faz-me o favor de exibir apenas um arquivo por vez, nada de arquivos repetidos na listagem.

Assim eu tenho uma listagem limpa, simples e rápida. Exatamente o que precisava.

Ah, para fazer o replace pode ser utilizado o sed, mas isto já seria assunto para uma outra dica...

Grande abraço,
Xico.

Outras dicas deste autor

Placa de rede Attansic L2 100 Mbit no Slackware 12

Instalando IBM Lotus Symphony com corretor ortográfico pt_BR no Slackware

Scroll no touchpad do Dell Inspiron 1525 (Slackware)

Tar: Descompactando arquivos específicos

Restaurando a lixeira no KDE

Leitura recomendada

Como verificar erro de senha dos usuários

Exemplos para o comando modprobe

Como gerar uma imagem ISO incluindo os "diretórios-pai" originais na raiz

Curiosidade sobre o comando "cal" e setembro de 1752

Ativar memória SWAP no Fedora

  

Comentários

Nenhum comentário foi encontrado.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts