CLI AI

grep recursivo excluindo um diretório

2026-06-08

grep -rn --exclude-dir={.git,node_modules,vendor} 'TODO' . encontra todas as ocorrências sem entrar nos três diretórios que estragam quase qualquer grep recursivo num repositório real. --exclude-dir só funciona junto com -r, e compara o nome do diretório, não o caminho. Aqui vai a receita completa, da busca recursiva ingênua até o ponto em que vale a pena instalar o ripgrep.

1. Buscar em todo o projeto

clai
$ clai encontra TODO em todos os arquivos dentro de g→ grep -rn 'TODO' g/g/src/a.js:1:TODO fixg/node_modules/b.js:1:TODO dep

-r percorre os subdiretórios, -n adiciona o número da linha. O problema aparece na hora: metade dos resultados vem de código de terceiros.

2. Excluir um diretório

clai
$ clai encontra TODO mas não entra em node_modules→ grep -rn --exclude-dir=node_modules 'TODO' g/g/src/a.js:1:TODO fix

--exclude-dir só funciona junto com -r. O nome do diretório é um padrão, não um caminho — sem barras.

3. Excluir vários de uma vez

clai
$ clai encontra TODO, pula node_modules, .git e vendor→ grep -rn --exclude-dir={.git,node_modules,vendor} 'TODO' .

O shell expande as chaves antes mesmo do grep rodar, então o grep recebe três flags separadas. Num sh sem brace expansion, é preciso escrever três --exclude-dir seguidos.

4. Buscar só nos arquivos que importam

clai
$ clai encontra TODO só em arquivos javascript→ grep -rn --include='*.js' 'TODO' .

--include é uma lista de permissão. Quando você já sabe onde procurar, é mais curto e mais rápido do que uma longa cadeia de exclusões.

5. Não tropeçar em binários

clai
$ clai encontra TODO ignorando arquivos binários→ grep -rnI 'TODO' .

Sem -I, o grep imprime "Binary file … matches" a cada ocorrência num binário em vez de uma linha — isso polui a saída e quebra qualquer script que tente interpretar o resultado. -I simplesmente pula esses arquivos.

6. Quando as flags se acumulam

clai
$ clai encontra TODO no projeto, respeitando o gitignore→ rg 'TODO'

O ripgrep lê o .gitignore por padrão, pula o .git e os binários — tudo isso sem uma única flag, e mais rápido. Se hoje já é a terceira vez que você escreve uma cadeia longa de --exclude-dir, é hora de instalar.

Pegadinhas

  • --exclude-dir sem -r não faz nada, em silêncio. A flag é aceita mas nunca aplicada, e você vai achar que está quebrada.
  • O padrão em --exclude-dir não é um caminho. --exclude-dir=src/vendor não vai bater com nada, porque o grep compara o nome do diretório, não o caminho até ele. Escreva --exclude-dir=vendor.
  • Coloque o padrão entre aspas. grep -r --include=*.js deixa o shell expandir *.js contra o diretório atual antes do grep ver isso, e você obtém uma busca completamente diferente.

Perguntas relacionadas

Como excluo o próprio diretório .git? --exclude-dir=.git. O ponto no início não muda nada — rodar -r num repositório sem essa flag despeja lixo do banco de objetos do git.

Como conto as ocorrências em vez de mostrá-las? grep -rc 'TODO' . imprime uma contagem por arquivo; grep -rho 'TODO' . | wc -l dá o total de ocorrências.

grep ou ripgrep? O grep está em toda parte e vale a pena conhecer. O ripgrep é mais rápido e já vem sensato por padrão, mas precisa ser instalado, e num servidor de terceiros isso nem sempre é possível.

Veja também

Pare de decorar flags de exclusão — descreva o que você procura e o CliAI escreve o grep. Instale em uma linha.