find je mocný nástroj, ale jeho syntaxe patří k nejošklivějším v celém Unixu. find . -type f -name "*.md" -not -path "./node_modules/*" – kdo to má pamatovat. fd řeší přesně tohle: dělá 90 % toho, co lidi z find reálně potřebují, ale jednoduše.
Instalace
sudo pacman -S fd
Balíček je v extra repu. Na jiných distribucích může být pod názvem fd-find, na Archu je čistě fd.
Základní použití
# najdi vše s "config" v názvu (rekurzivně od aktuální složky)
fd config
# jen v konkrétní cestě
fd config ~/.config
# jen soubory (bez složek)
fd -t f config
# jen složky
fd -t d config
# podle přípony
fd -e md
fd -e py
# včetně skrytých souborů
fd -H .env
# včetně ignorovaných v .gitignore
fd -I nejaky-vzor
Porovnání s find
Najdi všechny .md soubory:
# find
find . -type f -name "*.md"
# fd
fd -e md
Najdi soubor a spusť nad ním příkaz:
# find
find . -name "*.log" -exec rm {} \;
# fd
fd -e log -x rm
Najdi soubory změněné za posledních 24 hodin:
# find
find . -type f -mtime -1
# fd
fd --changed-within 1d
Rozdíl je vidět hlavně v čitelnosti.
Co fd umí navíc
Respektuje .gitignore. Neprohledává node_modules, target, .venv a další adresáře, které jsi vyloučil. Můžeš to obejít přes -I.
Barevný výstup. Rozlišuje typy souborů podle LS_COLORS.
Paralelní hledání. Využívá všechna dostupná jádra CPU.
Chytré case-insensitive matching. Když napíšeš fd readme, najde i README.md a Readme. Když použiješ velké písmeno (fd README), přepne se do case-sensitive režimu (smart case).
Regex out-of-the-box. Vzor je regex, ne shell glob. Pro glob použij -g.
fd '^test_.*\.py$' # regex
fd -g 'test_*.py' # glob
Kombinace s dalšími nástroji
Spouštění akce nad výsledky:
# smaž všechny .log soubory
fd -e log -x rm
# převeď všechny .png na .webp
fd -e png -x cwebp {} -o {.}.webp
# {} = cesta k souboru
# {.} = cesta bez přípony
# {/} = jen název souboru
# {//} = cesta k rodičovské složce
Paralelní zpracování s -x:
# každý soubor jako samostatný proces (paralelně)
fd -e jpg -x jpegoptim
# všechny soubory najednou (jako xargs)
fd -e jpg -X du -ch
Kombinace s bat pro preview:
fd -e md | fzf --preview 'bat --color=always {}'
Kombinace s ripgrepem:
# najdi TODO jen v Python souborech
fd -e py -X rg "TODO"
Praktické triky
Vyloučit konkrétní adresáře:
fd -e md -E node_modules -E .venv
Podle velikosti:
fd --size +10M # větší než 10 MB
fd --size -1k # menší než 1 KB
Podle času změny:
fd --changed-within 2h
fd --changed-before 1week
Absolutní cesty:
fd -a config
Follow symlinks:
fd -L config
Vlastní hloubka:
fd --max-depth 3 config
fd -d 3 config # zkráceně
Alias
Do ~/.zshrc:
alias find='fd'
Když opravdu potřebuješ původní find:
\find . -name "*.md"
command find . -name "*.md"
Konfigurace
fd nepoužívá config soubor – všechno se ovládá přes proměnné a přepínače.
Užitečné proměnné:
# vlastní výchozí ignorace (kromě .gitignore)
export FD_IGNORE_FILE=~/.config/fd/ignore
~/.config/fd/ignore:
node_modules
target
.venv
__pycache__
*.pyc
Kdy se vrátit k find?
find má fičury, které fd nemá:
- Komplexní logika s -and, -or, -not - Kontrola oprávnění (-perm) - Změna vlastníka souborů během hledání - Kompatibilita napříč všemi UNIX systémy Pro skripty, které musí běžet i na starém serveru bez fd, drž se find.
Shrnutí
fd neuchvátí nikoho, kdo find důkladně nezná. Ale kdo ho zná a proklíná jeho syntaxi, ocení fd do pěti minut. Kratší, rychlejší, respektuje .gitignore.
Příště se podíváme na ripgrep – nejrychlejší způsob, jak hledat text v souborech.

Komentáře