Dicas avançadas de navegação e busca com find e fd no Linux

1. Introdução ao find e fd: Por que dominar a busca de arquivos?

A busca eficiente de arquivos no Linux é uma habilidade essencial para administradores de sistemas, desenvolvedores e usuários avançados. O comando find, presente desde os primórdios do Unix, oferece flexibilidade incomparável, enquanto o fd (escrito em Rust) surge como alternativa moderna e extremamente rápida.

O find brilha em sistemas legados, ambientes mínimos e cenários que exigem lógica complexa com expressões regulares avançadas. Já o fd se destaca pela velocidade — frequentemente 5 a 10 vezes mais rápido — e sintaxe intuitiva, ideal para buscas cotidianas em projetos com muitos arquivos.

Para instalar o fd no Ubuntu/Debian:

sudo apt install fd-find

No Fedora:

sudo dnf install fd-find

No Arch Linux:

sudo pacman -S fd

2. Expressões de busca avançada com find

O find permite combinar múltiplos critérios com operadores lógicos. O operador -a (AND implícito) combina condições, -o (OR) oferece alternativas e ! nega critérios.

Exemplo: encontrar arquivos com mais de 1MB ou modificados nos últimos 7 dias, mas que não sejam logs:

find /var/log -size +1M -o -mtime -7 ! -name "*.log"

Busca por permissões específicas:

find /etc -perm /4000 -type f

Localiza arquivos com bit SUID ativo (permissão 4000).

Filtro por tamanho e data de modificação:

find /home -size +100M -mtime +30 -type f

Encontra arquivos maiores que 100MB não modificados há mais de 30 dias.

Ações embutidas para processamento em lote:

find /tmp -name "*.tmp" -mtime +7 -delete

Remove arquivos temporários com mais de 7 dias.

Para executar comandos com confirmação:

find . -name "*.bak" -ok rm {} \;

3. Otimizando buscas com padrões e expressões regulares

Curingas tradicionais funcionam com -name e -path. O * corresponde a qualquer sequência, ? a um caractere e [] a conjuntos.

Exemplo: arquivos que começam com "backup" e têm extensão de dois caracteres:

find / -name "backup*.??"

Para padrões complexos, use -regex (compatível com Emacs) ou -iregex (case insensitive):

find /projects -type f -regex ".*\.\(pdf\|docx\|xlsx\)$"

Busca documentos do Office e PDFs.

Busca por texto no nome do arquivo com padrão específico:

find /data -type f -name "*relatorio*202[4-5]*"

4. Navegação eficiente com fd: sintaxe moderna e intuitiva

O fd simplifica drasticamente a busca. Comando básico:

fd padrao

Busca recursiva por "padrao" no diretório atual.

Filtrando por extensão:

fd -e py -e js

Encontra todos os arquivos Python e JavaScript.

Filtrando por tipo (f = arquivo, d = diretório):

fd -t d node_modules

Localiza diretórios chamados "node_modules".

Controle de profundidade:

fd -e log --max-depth 3

Busca arquivos .log até 3 níveis de profundidade.

Ignorando arquivos ocultos e respeitando .gitignore:

fd -H -t f "config"

Mostra também arquivos ocultos (padrão: ocultos são ignorados).

Para ignorar regras do .gitignore:

fd --no-ignore -e mp3

5. Combinando find/fd com outros comandos do terminal

O verdadeiro poder surge na combinação com outras ferramentas. Use xargs para processamento em lote:

find /var/log -name "*.gz" -mtime +90 | xargs -I {} rm {}

Para execução paralela com parallel (instale com sudo apt install parallel):

fd -e jpg -t f | parallel -j 4 convert {} {.}.png

Integração com grep para buscar conteúdo:

fd -e txt -x grep -l "erro crítico" {}

Com awk e sed para transformação:

fd -e csv | xargs -I {} awk -F, '{print $1,$3}' {} > dados_extraidos.txt

Movendo arquivos seletivamente:

fd -e mp4 -t f | xargs -I {} mv {} /mnt/videos/

6. Técnicas avançadas de performance e segurança

Limitação de profundidade com -maxdepth no find:

find / -maxdepth 2 -name "*.conf"

Usando -prune para pular diretórios específicos:

find / -path /proc -prune -o -path /sys -prune -o -name "*.core" -print

O -quit interrompe a busca após o primeiro resultado:

find / -name "senhas.txt" -quit

Para evitar problemas com espaços e caracteres especiais, sempre use -print0 com xargs -0:

find /home -type f -size +500M -print0 | xargs -0 -I {} du -sh {}

Monitoramento de performance:

time find / -name "*.log" -type f > /dev/null
time fd -e log -t f > /dev/null

7. Automação de tarefas repetitivas com find e fd

Script para limpeza automática de arquivos temporários:

#!/bin/bash
# Limpa arquivos temporários com mais de 30 dias
find /tmp -type f -atime +30 -delete
find /var/tmp -type f -atime +30 -delete
echo "Limpeza concluída em $(date)"

Agendamento com cron (edite com crontab -e):

0 3 * * 0 /usr/local/bin/clean_temp.sh

Gerando relatório de arquivos grandes:

#!/bin/bash
REPORT="/var/reports/arquivos_grandes_$(date +%Y%m%d).txt"
find /home -type f -size +1G -exec ls -lh {} \; > "$REPORT"
echo "Relatório gerado: $REPORT"

8. Comparação prática e dicas de migração de find para fd

Tabela de equivalência:

Objetivo Comando find Comando fd
Buscar por nome find . -name "*.txt" fd -e txt
Buscar por tipo diretório find . -type d -name "src" fd -t d src
Buscar por data (modif. hoje) find . -mtime 0 fd --changed-within 24h
Ignorar .gitignore find . -not -path './.git/*' fd --no-ignore
Executar comando find . -name "*.py" -exec wc -l {} + fd -e py -x wc -l

Exemplo lado a lado para permissões:

# find
find /usr/bin -perm /4000 -type f -exec ls -la {} \;
# fd
fd -t f -p /usr/bin -x ls -la {} \; --and -perm /4000

Quando manter find: em scripts de sistemas legados, ambientes sem Rust, ou quando precisar de lógica booleana complexa com -prune e expressões regulares avançadas.

Quando adotar fd: fluxo diário, projetos com muitos arquivos, busca interativa no terminal e integração com ferramentas modernas.

Referências