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
grep "TODO" tarefas.txtgrep 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:
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.
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.
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.
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".
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.
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.