Pular para o conteúdo

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

Dica publicada em Linux / Comandos
Francisco Ambrozio fco
Hits: 17.851 Categoria: Linux Subcategoria: Comandos
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

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.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Criando uma ISO de DVD "bootável" do Slackware

Atualizando Slackware 12.0 para -current (pré 12.1)

Diminuindo o tempo de boot do Slackware

Scroll no touchpad do Dell Inspiron 1525 (Slackware)

Não sabe onde está? - Procure!

SSH com chave pública + SVN por SSH

Eliminando linhas em branco

Print screen no XFCE

Samba 4 - Corrigindo erro "LDAP error 50 LDAP_INSUFFICIENT_ACCESS_RIGHTS"

Ajustando horário no Slackware

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.