fd: Uma Alternativa Mais Simples e Rápida ao find

fd: Uma Alternativa Mais Simples e Rápida ao find

O Que Você Vai Aprender

  • Escapar da sintaxe complexa do find e buscar recursivamente com apenas fd PATTERN
  • Resolver o detalhe do fdfind no Ubuntu/Debian (o comando não se chama fd)
  • Dominar os padrões do mundo real: extensões, tipos, tratamento de gitignore, -x exec

Resumo Rápido

  • "Onde está aquele arquivo?" do dia a dia -> fd PATTERN (rápido, curto, colorido)
  • Buscar até arquivos ignorados -> fd -H -I PATTERN
  • Quando você ainda precisa do find -> condições complexas como -newer, formatação -printf, máquinas apenas POSIX

Premissas (ambiente alvo)

  • SO: Ubuntu 22.04 / 24.04 (família Debian) como alvo principal; adapte para outras distros
  • fd 8.x ou posterior

O Que é o fd?

Conclusão: fd é uma ferramenta moderna de busca de arquivos escrita em Rust. Como alternativa ao find, oferece sintaxe curta, alta velocidade, tratamento automático de .gitignore e saída colorida.

fd é uma alternativa amigável ao find, desenvolvida em sharkdp/fd. Ele não substitui todos os recursos do find, mas para 90% das buscas de arquivos do dia a dia, é mais rápido e mais curto de escrever.

Diferenças principais em relação ao find:

Aspecto find fd
Sintaxe básica find . -name '*.txt' fd '\.txt$' / fd -e txt
Estilo de busca exato por padrão (-name) regex de substring
Case sensitivity case-sensitive smart case (ignora se minúsculo)
Arquivos ocultos pesquisados excluídos por padrão (-H para incluir)
.gitignore ignorado respeitado automaticamente (-I desativa)
Saída monocromática colorida (por tipo)
Velocidade base de referência paralelo, rápido

Como Instalar o fd?

Conclusão: No Ubuntu/Debian, instale com apt install fd-find — mas o comando se chama fdfind, não fd. A solução comum é um symlink ou alias para expor como fd.

Instalar por distribuição:

# Ubuntu / Debian
sudo apt install fd-find

# Fedora / familia RHEL
sudo dnf install fd-find

# Arch Linux
sudo pacman -S fd

# macOS (Homebrew)
brew install fd

# Pelo cargo do Rust
cargo install fd-find

Detalhe do Ubuntu/Debian: o comando é fdfind

Devido a um conflito de nome com outro pacote (fdclone) no Debian, o binário se chama fdfind em vez de fd. Digitar fd diretamente resulta em command not found.

Para usá-lo como fd, crie um symlink em ~/.local/bin:

mkdir -p ~/.local/bin
ln -s "$(which fdfind)" ~/.local/bin/fd

Se ~/.local/bin não está no seu PATH, adicione ao ~/.bashrc e recarregue:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Verifique a instalação e versão:

fd --version
fd 9.0.0

Quais São os Fundamentos do fd?

Conclusão: fd PATTERN busca recursivamente abaixo do diretório atual. O padrão é uma regex de substring, e você pode passar o diretório raiz como segundo argumento.

O uso mínimo é apenas um fragmento do nome que você quer:

fd readme
README.md
docs/readme-ja.md
src/readme.txt

Onde o find precisa de find . -iname '*readme*', fd readme é suficiente. O case é tratado com smart case (case-insensitive se o padrão é todo minúsculo).

Especifique o diretório inicial como segundo argumento:

# Buscar config abaixo de src/
fd config src/

O padrão é interpretado como expressão regular, então pontos e âncoras funcionam diretamente:

# Arquivos terminando em .log
fd '\.log$'

fd sem argumentos lista todos os arquivos e diretórios abaixo do atual (excluindo os de .gitignore e ocultos). Use em vez de ls -R.

Como Filtrar por Extensão ou Tipo?

Conclusão: Filtre por extensão com -e EXT e por tipo com -t TYPE (f=arquivo / d=diretório / l=symlink / x=executável). Múltiplos valores são combinados com OR.

Filtre por extensão com -e (--extension); sem ponto necessário:

# Encontrar .jpg e .png (multiplas flags = OR)
fd -e jpg -e png

Filtre por tipo com -t (--type):

# Apenas diretorios
fd -t d node_modules

# Apenas arquivos executaveis
fd -t x

# Arquivos / diretorios vazios
fd -t empty

Valores de tipo comuns:

  • f ... arquivo regular
  • d ... diretório
  • l ... symlink
  • x ... executável
  • e ... vazio

Combine com um padrão para fazer "arquivos .rs abaixo de src" de uma vez:

fd -e rs main src/

Como Buscar Arquivos Ocultos ou do .gitignore?

Conclusão: Por padrão, fd exclui arquivos ocultos e tudo no .gitignore. Use -H para incluir ocultos, -I para desativar regras de ignore, e -u (unrestricted) para remover ambos de uma vez.

O comportamento "útil" do fd pode atrapalhar — por isso uma busca por .env ou node_modules/ retorna vazia.

# Incluir ocultos (dotfiles)
fd -H '\.env'

# Ignorar .gitignore / .ignore e buscar tudo
fd -I node_modules

# Remover ambas as restricoes (unrestricted)
fd -u secret

-u é abreviação de --no-ignore --hidden (equivalente a -HI).

Para excluir um diretório explicitamente, use -E (--exclude):

# Excluir .git e saida de build
fd -E .git -E dist -e js

Como Executar um Comando em Cada Resultado?

Conclusão: -x (--exec) executa um comando por resultado em paralelo; -X (--exec-batch) executa uma vez com todos os resultados. Ambos são mais rápidos e curtos que find -exec.

-x / -X substituem find ... -exec, e placeholders incorporam cada resultado.

# Deletar cada arquivo .tmp (executar em paralelo)
fd -e tmp -x rm

# Passar todos os arquivos .png para optipng de uma vez (processo unico)
fd -e png -X optipng

Placeholders (usaveis dentro de -x):

  • {} ... caminho completo encontrado
  • {/} ... apenas nome do arquivo (basename)
  • {//} ... diretório pai
  • {.} ... caminho sem extensão
  • {/.} ... nome do arquivo sem extensão

Exemplo: converter cada .jpg para um .png de mesmo nome:

fd -e jpg -x convert {} {.}.png

Para operações destrutivas como -x rm, primeiro confira a lista com fd -e tmp (sem exec) antes de executar. Como fd respeita .gitignore, arquivos inesperados podem estar faltando — ou incluídos — nos resultados.

Quando Usar find vs fd?

Conclusão: Use fd para buscas do dia a dia e find para condições complexas, saída formatada ou ambientes apenas POSIX. Eles não são exclusivos — use fd como principal por velocidade e conveniência, find como secundário para condições especiais.

Casos onde fd é suficiente:

# Arquivos alterados nos ultimos 10 minutos
fd --changed-within 10min

# Arquivos maiores que 1MB
fd -S +1M

# Quando voce prefere sintaxe glob
fd -g '*.config.js'

Casos para escolher find:

  • Você precisa de -printf para saída finamente formatada
  • Comparações de tempo compostas como -newer fileA ! -newer fileB
  • Servidores de produção onde você não pode (ou não quer) instalar fd (não é padrão)

Copiar e colar: padrões comuns

fd PATTERN              # Busca recursiva por nome
fd -e log               # Filtrar por extensao
fd -t d PATTERN         # Apenas diretorios
fd -H -I PATTERN        # Buscar incluindo ocultos/ignorados
fd -e tmp -x rm         # Executar comando por resultado
fd --changed-within 1d  # Alterados no ultimo dia

Próxima Leitura