6. Hledání souborů
1. Úvod
Tato kapitola se zabývá vyhledáváním adresářových položek (souborů a adresářů). Převážně se zabývá příkazem „find“, který strukturu adresářů skutečně prochází a prohledává, ale zahrnuje také vyhledávání spustitelných souborů (programů) a na databázi založený příkaz „locate“.
GNU Findutils, jejichž součástí je příkaz „find“, jsou vyvíjeny v rámci projektu GNU.
2. Definice
- Výchozí bod je cesta (relativní či absolutní) zadaná příkazu „find“, ze které tento příkaz zahajuje vyhledávání. Může být absolutní i relativní. Nejčastěji se jedná o adresář (např. „.“), ale může jít i o soubor či symbolický odkaz na adresář či soubor. Příkaz find výchozí bod nezkracuje, vždy ho zpracovává tak, jak je zadán.
- Hloubka je celé číslo, které vyjadřuje počet adresářů od výchozího bodu k právě testované adresářové položce. Hloubku 0 mají pouze výchozí body; hloubku 1 soubory a podadresáře v nich, hloubku 2 ty další atd. Je-li např. „/usr/share“ výchozí bod, pak adresář „/usr/share“ má hloubku 0, soubor „/usr/share/.lock“ by měl hloubku 1, soubor „/usr/share/test/copyright.gz“ hloubku 2 atd.
- Průchod adresářovou strukturou může být do šířky (výchozí stav – každý adresář je nejprve zpracován sám o sobě (provedou se nad ním testy a v případě úspěchu se vykonají akce) a teprve poté do něj find vstoupí a prozkoumá jeho obsah) nebo do hloubky (v tom případě find pokaždé nejprve vstoupí do adresáře a zpracuje veškerý jeho obsah a teprve „na odchodu“ zpracuje i samotný adresář). Výchozí je průchod do šířky. Průchod do hloubky se aplikuje pouze tehdy, je-li zadán globální parametr „-depth“ nebo je-li použita akce „-delete“. Při průchodu do hloubky nelze použít akci „-prune“.
- Názvem položky se u příkazu „find“ rozumí samotný název adresářové položky (bez cesty).
- Cestou položky se u příkazu „find“ rozumí výchozí bod (tak, jak byl zadaný) a za ním adresářová cesta k položce včetně jejího názvu. Je-li např. výchozí bod „.“, je cestou položky např. „./test.sh“.
3. Zaklínadla: find: testy
3/1 Typ adresářové položky (soubor, adresář, odkaz...)
3/2 Název položky a cesta
Poznámka: Písmeno „i“ v následujících parametrech vypne rozlišování mezi velkými a malými písmeny.
3/3 Velikost souboru
3/4 Čas („změněno“, „čteno“)
3/5 Operátory testů
3/6 Vlastnictví a skupina položky
3/7 Přístupová práva
3/8 Obsah souboru
3/9 Zvláštní příznaky a datové položky
3/10 Velikost adresáře
3/11 Ostatní
4. Zaklínadla: find: akce
4/1 Vypsat údaje
4/2 Ostatní akce
5. Zaklínadla: Akce -printf a -fprintf
6. Zaklínadla: Celé příkazy
6/1 Hledání textových souborů podle obsahu
6/2 Hledání programů
6/3 Obecné hledání
7. Parametry příkazů
7/1 find
Chování k symbolickým odkazům: -P: nikdy nenásledovat (interpretovat každý odkaz jen jako adresářovou položku); -L: vždy následovat (chovat se, jako by na místě symbolického odkazu byl odkazovaný soubor, adresář apod.; vstupovat do takových adresářů); -H: následovat jen symbolické odkazy, které jsou přímo uvedeny jako „cesta“ na příkazové řádce.
Globální parametry:
☐ -xdev | Po každou „cestu“ na příkazové řádce omezí prohledávání jen na jeden souborový systém. |
☐ -depth | Adresář zpracuje až „na odchodu“, tzn. teprve po zpracování veškerého jeho obsahu. Normálně se adresář zpracuje jako první a pak se teprve testuje jeho obsah. |
☐ -maxdepth číslo | Sestoupí maximálně do uvedené hloubky. 0 znamená testovat jen cesty uvedené na příkazové řádce; 1 znamená testovat i položky v adresářích uvedených na příkazovém řádku; 2 znamená testovat i položky v podadresářích těchto adresářů atd. |
☐ -mindepth číslo | Na položky v hloubce nižší než „číslo“ se nebudou aplikovat žádné testy ani akce a nebudou vypsány. Pozor, to znamená, že na ně nebude účinkovat akce -prune! Příkaz find se pokusí vstoupit do každého adresáře s hloubkou menší než „mindepth“. |
Testy a akce jsou uvedeny jako zaklínadla v předchozí části kapitoly.
8. Instalace na Ubuntu
Většina uvedených příkazů je základními součástmi Ubuntu. Pouze příkaz „symlinks“ musíte v případě potřeby doinstalovat:
9. Tipy a zkušenosti
- Naučte se s příkazem „find“ používat akci „-exec“, zejména její hromadnou variantu „po dávkách“. Její použití je většinou mnohem pohodlnější než tradiční kombinace s příkazem „xargs“. Jedinou výjimkou je případ, kdy chcete příkazy vykonávat paralelně.
- Příkaz „find“ cesty na svém výstupu nijak neřadí, ale při průchodu do šířky (což je výchozí) „zpracuje“ adresář dřív, než do něj vstoupí a prohledá jeho obsah. Při průchodu do hloubky naopak zpracuje adresář až po zpracování celého podstromu uvnitř něj.
- Příkaz „locate“ respektuje přístupová práva a najde pouze adresářové položky, ke kterým má uživatel v dané chvíli přístup.
- Nepoužívejte akci „-execdir“. Je pomalá při spouštění akce v mnoha adresářích a odmítne pracovat, pokud bude v proměnné prostředí PATH relativní cesta nebo závěrečná dvojtečka.
10. Další zdroje informací
- Wikipedie: find
- Oficiální dokumentace balíčku „findutils“ (anglicky)
- YouTube: Linux Find Command Tutorial (anglicky)
- YouTube: Find Files in Linux (find, whereis) (anglicky)
- man find (anglicky)
- Balíček findutils (anglicky)
- TL;DR: find (anglicky)
- TL;DR: locate (anglicky)
- TL;DR: which (anglicky)
11. Zákulisí kapitoly
V této verzi kapitoly chybí:
- nic
Tato kapitola záměrně nepokrývá:
- nic