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
fdfindno Ubuntu/Debian (o comando não se chamafd) - Dominar os padrões do mundo real: extensões, tipos, tratamento de gitignore,
-xexec
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 chamafdfind, nãofd. A solução comum é um symlink ou alias para expor comofd.
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 PATTERNbusca 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 EXTe 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 regulard... diretóriol... symlinkx... executávele... 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-Hpara incluir ocultos,-Ipara 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 quefind -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 {} {.}.pngPara 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
-printfpara 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