Menu

Příkaz find

find je velice mocný nástroj pro vyhledávání souborů a manipulaci s nimi. Pokud spustíme find bez parametrů (nebo s parametrem .), vypíše rekurzivně obsah adresářového stromu nacházejícího se pod aktuálním adresářem.

Přidáváním dalších parametrů (pozor, ačkoliv začínají pomlčkou, nejsou to přepínače – píšeme je až za seznam prohledávaných adresářů) můžeme tyto soubory filtrovat a vybírat z nich jenom některé.

find . -name '*.txt'    ... soubory s příponou .txt
find . -user root       ... soubory jejichž vlastníkem je root
find . -type f          ... obyčejné soubory
find . -type d          ... adresáře
find . -size +10000c    ... soubory větší než 10000 bajtů
find . -newer file      ... soubory novější než soubor file
find . -mtime -7        ... soubory změněné v posledních 7 dnech

find . -prune           ... hledá jenom zadané soubory, nerozbaluje adresáře
find . -depth           ... zanořuje se do podadresářů (defaultní chování)

Pokud zapíšeme více filtrů najednou, find vypisuje jenom ty soubory, které vyhovují všem. Pokud bychom chtěli vypsat ty soubory, které splňují alespoň jeden filtr, můžeme použít parametr -o. Příklaz který vypíše všechny obyčejné soubory s příponou .txt nebo .sh, které byly buď změněny během posledních 14 dnů nebo jsou větší než 1kB by vypadal takto:

find . -type f \( -name '*.txt' -o -name '*.sh' \) \( -mtime -14 -o -size +1024c \)

Všimněte si zpětných lomítek před závorkami upravujících prioritu. Závorky mají v shellu speciální význam a proto jej musíme potlačit zpětným lomítkem. Libovolný filtr můžeme znegovat tím, že před něj napíšeme !

Parametr -exec

Teď teprve přichází ta pravá magie. find umí soubory nejenom vyhledávat, ale také pro ně provádět nejrůznější akce – přejmenovávat, mazat, vypisovat začátky, … Za parametr -exec můžeme napsat jeden shellovský příkaz. Dvojice znaků {} se nahradí jménem zpracovávaného souboru (i s cestou) a příkaz musí být ukončen sekvencí \;. Opět proto, že znak ; má v shellu speciální význam. Příklad, který vypíše první řádek ze všech nalezených souborů:

find . -type f -name '*.sh' -mtime -14 -exec head -n1 {} \;

Pokud chceme pro daný soubor provést více příkazů, máme dvě možnosti. První je použít více parametrů -exec napsaných za sebou. Druhou je zavolání příkazu sh -c 'příkazy', což je jeden příkaz, který spustí shell a zavolá v něm všechny zadané příkazy. Z hlediska findu se ale tváří jako jeden příkaz a proto ho můžeme předat parametru -exec

Užitečné nePOSIXové parametry

find . -maxdepth n    ... soubory v hloubce nejvýše n
find . -mindepth n    ... soubory v hloubce alespoň n
find . -size +10M     ... soubory větší než 10 megabajtů
find . -delete        ... smaž všechny odpovídající soubory