V prostředí Linux je nástroj `fd` elegantní alternativou ke klasickému příkazu `find`. Vyznačuje se přehlednou syntaxí, inteligentními výchozími nastaveními a intuitivním chováním. Pojďme se podívat, jak jej efektivně využít.
Rozdíly mezi `fd` a `find`
Příkaz `fd` si neklade za cíl plně nahradit tradiční příkaz `find`, který je součástí Linuxu již velmi dlouho. Namísto toho se snaží zjednodušit a zrychlit nejběžnější vyhledávací operace. Často je při nich dokonce 8 až 9 krát rychlejší než `find`. Pro srovnání výkonu se můžete podívat na stránku projektu na GitHubu.
`fd` disponuje barevným výstupem, podobně jako některé režimy příkazu `ls`. Prohledává adresáře rekurzivně, ale standardně vynechává skryté složky. Navíc rozumí systému Git a automaticky ignoruje položky uvedené v souboru „.gitignore“.
Ve výchozím stavu `fd` nerozlišuje velikost písmen. Pokud však vyhledávací vzor obsahuje alespoň jedno velké písmeno, `fd` automaticky přepne do režimu rozlišování malých a velkých písmen. Toto výchozí chování lze sice přepsat, v mnoha případech vám ale ušetří práci.
Instalace `fd`
Pro uživatele Ubuntu 19.04 (Disco Dingo) a novějších je instalace `fd` velmi snadná, stačí použít oficiálně spravovaný balíček `apt-get`. Pro starší verze Ubuntu najdete pokyny k instalaci na stránce repozitáře na Gitu.
Zadejte tento příkaz:
sudo apt-get install fd-find
V Ubuntu se příkaz jmenuje `fdfind`, aby nedocházelo ke kolizi s jinými nástroji. Pokud preferujete název `fd`, můžete si vytvořit alias:
alias fd=fdfind
Chcete-li, aby alias zůstal trvalý i po restartu, přidejte jej do souboru „.bashrc“ nebo „.bash_aliases“.
Pro instalaci `fd` na Fedoru použijte tento příkaz:
sudo dfn install fd-find
Na Manjaru provedete instalaci pomocí následujícího příkazu:
sudo pacman -Syu fd
`fd` vs `fdfind`
Abychom zabránili záměně, na testovacím počítači Ubuntu jsme nechali výchozí název příkazu `fdfind`. `fd` a `fdfind` jsou identické příkazy. Jak uvidíte v následujícím příkladu (když se `fdfind` zeptáte na verzi, představí se jako „fd“):
fdfind --version
V dalším textu budeme primárně používat označení „fd“, ale v příkladech pro Ubuntu zůstaneme u `fdfind`. V jiných distribucích Linuxu stačí používat příkaz `fd` a ušetříte pár úhozů.
Základní vyhledávání s `fd`
Pokud spustíte `fd` bez dalších parametrů, chová se podobně jako `ls`, ale s tím rozdílem, že standardně vypisuje soubory i z podadresářů.
Zadejte:
fdfind
Výstup je barevně rozlišen pro různé typy souborů a složek.
Pro zobrazení souborů určitého typu použijte volbu `-e` (přípona). Nemusíte zadávat tečku před příponou a nerozlišuje se velikost písmen.
Například:
fdfind -e png
Nyní jsou vypsány pouze soubory obrázků PNG.
Pro vyhledání konkrétního souboru stačí zadat jeho název:
fdfind index.page
Soubor byl nalezen v podadresáři. `fd` prohledává rekurzivně automaticky.
Pokud chcete vyhledávat od určitého adresáře, zadejte jeho cestu jako argument. Například tento příkaz prohledá adresář „/etc“ a hledá soubory s „passwd“ v názvu:
fdfind passwd /etc
Zde hledáme zdrojové soubory C s „coord“ v názvu:
fdfind -e c coord
Byly nalezeny dva soubory.
`fd` a Git
Git je populární systém pro správu verzí zdrojového kódu. Pokud používáte Git, pravděpodobně máte soubory „.gitignore“, které říkají Gitu, které soubory má ignorovat. Ve výchozím stavu `fd` respektuje toto nastavení.
V tomto adresáři máme Git repozitář a soubor „.gitignore“. Zadáme:
ls -adl .git*
Necháme `fd` vypsat všechny soubory s „coord“ v názvu. Poté zopakujeme hledání s volbou `-I` (no ignore), která ignoruje nastavení v „.gitignore“ a vypíše všechny odpovídající soubory.
Zadáme:
fdfind coord
fdfind coord -I
Dva další soubory v druhém výstupu jsou objektové soubory, které vznikají při kompilaci programu a jsou pak použity linkerem k vytvoření spustitelného souboru.
Objektové soubory jsou verzovacími systémy standardně ignorovány, protože jsou vytvářeny při každé kompilaci programu. V souboru „.gitignore“ je proto definováno pravidlo pro jejich ignorování a `fd` se chová stejně.
Volba `-I` (no ignore) donutí `fd` vypsat vše bez ohledu na nastavení v „.gitignore“.
Typy souborů a rozlišování velikosti písmen
Pomocí `fd` můžete vyhledávat adresáře, soubory (včetně spustitelných a prázdných) a symbolické odkazy. Použijte k tomu volbu `-t` (typ) následovanou jedním z písmen:
f: Soubor.
d: Adresář.
l: Symbolický odkaz.
x: Spustitelný soubor.
e: Prázdný soubor.
Následující příkaz hledá adresář s názvem „images“:
fdfind -td images
Byla nalezena shoda o jeden podadresář níže.
Podívejme se, jak funguje rozlišování malých a velkých písmen ve vyhledávacích vzorech. Nejdříve vyhledáme soubory obsahující „geo“ v názvu a poté ty, které obsahují „Geo“:
fdfind -tf geo
fdfind -tf Geo
V prvním příkazu jsme použili vzor s malými písmeny, proto `fd` nerozlišoval velikost písmen. „geo“ i „Geo“ jsou platné shody.
Ve druhém příkazu jsme použili velké písmeno, `fd` přešel do režimu rozlišování velikosti písmen a platnou shodou je pouze „Geo“.
Spouštění příkazů
`fd` umožňuje spouštět další příkazy na všech nalezených souborech.
Řekněme, že víme o existenci zip souboru někde ve struktuře zdrojových kódů. Najdeme jej pomocí tohoto příkazu, který vyhledává soubory s příponou zip:
fdfinf -e zip
Pomocí volby `-x` (exec) můžeme předat každý nalezený soubor jinému příkazu. Například zde voláme nástroj unzip pro rozbalení našeho ZIP souboru („{}“ je zástupný symbol pro nalezený soubor):
fdfind -e zip -x unzip {}
Tím se soubor rozbalí v aktuálním pracovním adresáři. Pokud chceme soubor rozbalit do adresáře, kde se nachází ZIP soubor, můžeme použít jeden z těchto zástupných symbolů:
{}: Úplná cesta a název nalezeného souboru.
{/}: Název nalezeného souboru.
{//}: Adresář obsahující nalezený soubor.
{/.}: Název nalezeného souboru bez přípony.
Aby se ZIP soubor rozbalil do svého adresáře, použijeme volbu `unzip -d` (adresář) a předáme jí zástupný symbol nadřazeného adresáře (`{//}`):
fdfind -e zip -x unzip {} -d {//}
Soubor je nalezen a rozbalen do svého adresáře.
Závěr
Díky své jednoduchosti a zaměření na běžné použití se `fd` může stát vaším novým „příkazem pro vyhledávání“. Když budete potřebovat pokročilejší funkce, můžete se vždy spolehnout na osvědčený `find`.