fd: Uma Alternativa Mais Simples e Rapida ao find

fd: Uma Alternativa Mais Simples e Rapida ao find

O Que Voce 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 nao se chama fd)
  • Dominar os padroes do mundo real: extensoes, tipos, tratamento de gitignore, -x exec

Resumo Rapido

  • "Onde esta aquele arquivo?" do dia a dia -> fd PATTERN (rapido, curto, colorido)
  • Buscar ate arquivos ignorados -> fd -H -I PATTERN
  • Quando voce ainda precisa do find -> condicoes complexas como -newer, formatacao -printf, maquinas apenas POSIX

Premissas (ambiente alvo)

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

O Que e o fd?

Conclusao: fd e uma ferramenta moderna de busca de arquivos escrita em Rust. Como alternativa ao find, oferece sintaxe curta, alta velocidade, tratamento automatico de .gitignore e saida colorida.

fd e uma alternativa amigavel ao find, desenvolvida em sharkdp/fd. Ele nao substitui todos os recursos do find, mas para 90% das buscas de arquivos do dia a dia, e mais rapido e mais curto de escrever.

Diferencas principais em relacao ao find:

Aspecto find fd
Sintaxe basica find . -name '*.txt' fd '\.txt$' / fd -e txt
Estilo de busca exato por padrao (-name) regex de substring
Case sensitivity case-sensitive smart case (ignora se minusculo)
Arquivos ocultos pesquisados excluidos por padrao (-H para incluir)
.gitignore ignorado respeitado automaticamente (-I desativa)
Saida monocromatica colorida (por tipo)
Velocidade base de referencia paralelo, rapido

Como Instalar o fd?

Conclusao: No Ubuntu/Debian, instale com apt install fd-find — mas o comando se chama fdfind, nao fd. A solucao comum e um symlink ou alias para expor como fd.

Instalar por distribuicao:

# 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 e fdfind

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

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

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

Se ~/.local/bin nao esta no seu PATH, adicione ao ~/.bashrc e recarregue:

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

Verifique a instalacao e versao:

fd --version
fd 9.0.0

Quais Sao os Fundamentos do fd?

Conclusao: fd PATTERN busca recursivamente abaixo do diretorio atual. O padrao e uma regex de substring, e voce pode passar o diretorio raiz como segundo argumento.

O uso minimo e apenas um fragmento do nome que voce quer:

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

Onde o find precisa de find . -iname '*readme*', fd readme e suficiente. O case e tratado com smart case (case-insensitive se o padrao e todo minusculo).

Especifique o diretorio inicial como segundo argumento:

# Buscar config abaixo de src/
fd config src/

O padrao e interpretado como expressao regular, entao pontos e ancoras funcionam diretamente:

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

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

Como Filtrar por Extensao ou Tipo?

Conclusao: Filtre por extensao com -e EXT e por tipo com -t TYPE (f=arquivo / d=diretorio / l=symlink / x=executavel). Multiplos valores sao combinados com OR.

Filtre por extensao com -e (--extension); sem ponto necessario:

# 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 ... diretorio
  • l ... symlink
  • x ... executavel
  • e ... vazio

Combine com um padrao para fazer "arquivos .rs abaixo de src" de uma vez:

fd -e rs main src/

Como Buscar Arquivos Ocultos ou do .gitignore?

Conclusao: Por padrao, 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 "util" 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 e abreviacao de --no-ignore --hidden (equivalente a -HI).

Para excluir um diretorio explicitamente, use -E (--exclude):

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

Como Executar um Comando em Cada Resultado?

Conclusao: -x (--exec) executa um comando por resultado em paralelo; -X (--exec-batch) executa uma vez com todos os resultados. Ambos sao mais rapidos 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)
  • {//} ... diretorio pai
  • {.} ... caminho sem extensao
  • {/.} ... nome do arquivo sem extensao

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

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

Para operacoes 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 incluidos — nos resultados.

Quando Usar find vs fd?

Conclusao: Use fd para buscas do dia a dia e find para condicoes complexas, saida formatada ou ambientes apenas POSIX. Eles nao sao exclusivos — use fd como principal por velocidade e conveniencia, find como secundario para condicoes especiais.

Casos onde fd e 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:

  • Voce precisa de -printf para saida finamente formatada
  • Comparacoes de tempo compostas como -newer fileA ! -newer fileB
  • Servidores de producao onde voce nao pode (ou nao quer) instalar fd (nao e padrao)

Copiar e colar: padroes 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

Proxima Leitura