Bonusové patnácté cvičení – Find bez findu (velký příklad)
Úkolem je napsat vlastní příkaz find bez použití skutečného příkazu find.
Použití
Find se bude používat jako:
find <přepínače> <akce> [cesty]...
Cest může být použito i více. Find má spustit akce na všech souborech, které našel v podstromech souborového systému pod danými cestami a které odpovídají vyhledávacím kritériím specifikovaných v části s přepínačemi.
Při zadání nesprávných přepínačů nebo akcí musí skript skončit rozumnou chybovou hláškou.
Přepínače
Přepínače jsou určené pro řízení vyhledávání. Jsou to:
- -path <wildcard> – celá cesta nalezených souborů musí odpovídat zadanému wildcardu (můžete implementovat i variantu s regexpem, pokud chcete)
- -newer <soubor> – vyhovují pouze novější soubory, než je referovaný soubor
- -user <name/uid> -- jméno nebo uid vlastníka (pokud je to číslo, je to vždy uid)
- -type <typ> – typ souboru (file, directory, symlink – prostě první sloupec výpisu ls -l (až na f))
- -depth <hloubka> – hloubka vyhledávání, pokud je to jen číslo, tak nalezne pouze soubory přesně v této hloubce, pokud to je +číslo, tak soubory maximálně v této hloubce, pokud -číslo, tak soubory minimálně v této hloubce)
V jednodušší verzi bude každý přepínač použitý maximálně jednou a přepínače mohou být použité pouze ve výše uvedeném pořadí, v těžší verzi mohou být použity v libovolném pořadí a vždy platí poslední napsaná definice (pozdější depth) přepíše dřívější depth.
Akce
Akce je vždy napsána až za všemi přepínači a je maximálně jedna. Pokud akce není uvedena, tak se použije implicitní akce, což je print. Akce jsou:
- print – vypíše cestu k souboru
- ls – výpis ve tvaru ls -l
- exec <příkaz> ";" – spustí příkaz, kde se místo \tt {} v příkazu dosadí cesta k souboru (nahrazovací sekvece)
- Skutečný příkaz
find
:-) - Přepínače příkazu
test
-ot
a-nt
(porovnávání starší a novější je potřeba udělat jinak) - Zakázáno
ls -n
als -R
Zakázané věci
Ukázkové řešení
Skryto pro možnost znovupoužití příkladu v dalším roce.