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 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 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 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 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 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 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-dirsem-rnão faz nada, em silêncio. A flag é aceita mas nunca aplicada, e você vai achar que está quebrada.- O padrão em
--exclude-dirnão é um caminho.--exclude-dir=src/vendornã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=*.jsdeixa o shell expandir*.jscontra 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
- Encontrar e substituir em todos os arquivos de um projeto
- Imprimir uma coluna de um CSV com awk
- JSON na linha de comando
Pare de decorar flags de exclusão — descreva o que você procura e o CliAI escreve o grep. Instale em uma linha.