Aprenda / Terminal e linha de comando

FundamentosAula 7 de 1615 min0% da trilha

Buscando coisas: grep e find

Duas perguntas diferentes — 'onde está esse texto' e 'onde está esse arquivo' — duas ferramentas diferentes.

Quando o projeto cresce, procurar coisas manualmente abrindo pasta por pasta deixa de ser viável. O terminal resolve isso com duas ferramentas que respondem perguntas diferentes: grep busca dentro do conteúdo dos arquivos (que texto tem ali), e find busca pelos próprios arquivos (nome, tipo, localização) — sem olhar o que tem escrito dentro.

grep — buscando texto dentro de arquivos

terminal
grep "TODO" tarefas.txt

grep imprime só as linhas do arquivo que contêm o texto buscado — não o arquivo inteiro, só o que bateu com a busca. Três flags resolvem praticamente todo uso do dia a dia:

terminal
grep -r "TODO" src/

-r (recursive) faz o grep entrar em todas as subpastas de src/ em vez de olhar só o nível atual — essencial quando você não lembra em qual arquivo exato deixou aquele comentário.

terminal
grep -i "todo" tarefas.txt

-i (case-insensitive) ignora maiúscula/minúscula — sem ela, grep "todo" não encontraria uma linha escrita como TODO ou Todo, porque por padrão o grep diferencia maiúsculas de minúsculas.

terminal
grep -n "TODO" tarefas.txt

-n mostra o número da linha onde o texto foi encontrado — útil quando você vai abrir o arquivo num editor logo em seguida e quer ir direto na linha certa, sem precisar procurar de novo visualmente.

find — buscando os próprios arquivos

find não olha conteúdo — ele varre a árvore de pastas procurando arquivos ou pastas que batem com algum critério: nome, tipo, tamanho, data, entre outros. A forma básica é find pasta-onde-procurar critério.

terminal
find . -name "*.test.js"

-name busca pelo nome do arquivo (aceitando * como coringa) a partir da pasta indicada — aqui, . significa "a partir da pasta atual, entrando em todas as subpastas".

terminal
find . -type d -name "node_modules"

-type filtra pelo tipo do item: f pra arquivo (file), d pra pasta (directory). O exemplo acima acha todas as pastas chamadas exatamente node_modules, ignorando qualquer arquivo comum que por acaso tenha esse nome.

Combinando os dois

Como grep e find respondem perguntas diferentes, é comum combiná-los com pipe: usar find pra limitar quais arquivos olhar, e grep pra olhar o conteúdo deles.

terminal
find . -name "*.js" -type f | xargs grep -l "console.log"

(O xargs aqui só repassa cada nome de arquivo encontrado como argumento pro grep — um detalhe que vai fazer mais sentido conforme você pratica, não precisa decorar agora.)

Exercício

Você lembra que escreveu a palavra "FIXME" em algum arquivo .py dentro da pasta backend/, mas não lembra em qual arquivo nem em qual linha. Escreva um comando grep que ache isso mostrando o arquivo e o número da linha.

Quiz rápido

Qual a diferença fundamental entre o que 'grep' e 'find' procuram?
Rodando 'grep "erro"' num arquivo que só tem a palavra 'Erro' (com E maiúsculo), o que acontece?