find

find
Typ softwarustandardní UNIXová utilita či příkaz
Některá data mohou pocházet z datové položky.

find je v informatice název unixového nástroje pro rekurzivní prohledávání adresářového stromu souborového systému. Příkaz umožňuje pomocí parametrů určit vlastnosti hledaného objektu (tj. souboru či adresáře), například velikost, část názvu a podobně, stejně jako akci, která má být s nalezeným objektem provedena.

Syntaxe

find [-H] [-L] [-P] [cesta...] [výraz]

První tři parametry určují, jak by měl příkaz přistupovat k symbolickým odkazům. Standardně je nikdy nenásleduje, což může být stanoveno parametrem -P. Parametr -L způsobí následování symbolický odkazů. S parametrem -H budou symbolické odkazy následovány pouze při zpracovávání parametrů příkazového řádku. Pokud není uvedena cesta, prohledává se aktuální adresář.

Prvky výrazu jsou odděleny mezerami a jsou vyhodnocovány zleva doprava. Výraz může obsahovat logické operátory AND (-a) a OR (-o), stejně jako složitější predikáty. GNU find má velké množství rozšíření proti standardu POSIX.

Příklady použití

V aktuálním adresáři

find . -name 'my*'

Příkaz prohledá aktuální adresář (reprezentovaný tečkou) včetně jeho podadresářů a vyhledá soubory začínající na my. Uvozovky zabraňují shellu, aby nahradil výraz my* seznamem jmen souborů začínajícími na řetězec my v aktuálním adresáři (tzv. žolíková expanze).

Pouze soubory

find . -name "my*" -type f

Příkaz vypisuje pouze soubory, vynechá všechny adresáře, speciální soubory, symbolické odkazy, atd.

Příkazy

Předchozí příklady vytvořily seznam souborů, protože standardně příkaz find spustí akci -print (tj. vypsání nalezeného objektu).

find . -name "my*" -type f -ls

Příkaz vypíše seznam nalezených souborů spolu s jejich rozšířenými informacemi.

Prohledání všech adresářů

find / -type f -name "myfile" -print

Příkaz prohledá všechny adresáře v počítači a na terminál vypíše seznam souborů, které se jmenují myfile.

Prohledání všech adresářů kromě jednoho

find / -path excluded_folder -prune -o -type f -name myfile -print

Příkaz prohledá všechny adresáře v počítači kromě adresáře excluded_folder a seznam nalezených souborů, které se jmenují myfile, vypíše na terminál.

Specifikovaný adresář

find /home/weedly -name "myfile" -type f -print

Příkaz prohledá pouze adresář /home/weedly (domácí adresář uživatele weedly) a seznam nalezených souborů, které se jmenují myfile, vypíše na terminál.

Prohledání několika adresářů

find local /tmp -name mydir -type d -print

Příkaz prohledá adresář local v aktuálním adresáři a adresář /tmp, seznam nalezených adresářů, které se jmenují mydir, vypíše na terminál.

Ignorování chyb

Pokud příkaz find používá běžný uživatel, a ne root, může být vhodné ignorovat výpisy odepření přístupu a jiné chyby. Protože jsou chyby směrovány na výstup stderr, stačí ho přesměrovat do /dev/null:

find / -name "myfile" -type f -print 2>/dev/null

Alternativní metodou je použití příkazu grep:

find . -name "myfile" |& grep -v "Permission denied"

Příkaz vypíše na terminál seznam souborů, které se jmenují myfile a přihlášený uživatel k nim má přístupová práva.

Více možností jména souboru

find . \( -name "*jsp" -o -name "*java" \) -type f -ls

Příkaz vypíše rozšířené informace o souborech končících na jsp nebo java. Operátor OR může být zapsat i jako -o. Při neuvedení operátoru je předpokládán operátor AND. Použití závorek je nutné, v mnoha shellech musí být před nimi zpětná lomítka aby se shellu zamezilo závorky interpretovat jako své speciální znaky.

Provedení akce

find /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \;

Příkaz změní oprávnění všech souborů s příponou .mp3 v adresáři /var/ftp/mp3 na 644. Akce je vykonána pomocí parametru -exec chmod 644 {} \; v příkazu. Pro každý nalezený soubor je proveden příkaz chmod 644 {}, kde se {} nahradí jménem souboru. Středník označuje konec příkazu. Oktalově zapsané oprávnění 644 odpovídá záznamu rw-r--r-- dává vlastníkovi souboru plná oprávnění pro čtení a zápis do souboru, zatímco ostatní uživatelé mají pouze práva pro čtení. V některých shellech musí být {} v uvozovkách. Příkaz samotný by neměl být v uvozovkách, jinak by vypsal například následující chybu:

find: echo "mv ./3bfn rel071204": No such file or directory

která znamená, že se příkaz find snaží spustit soubor pojmenovaný echo "mv ./3bfn rel071204".

V případě mnoha nalezených souborů je efektivnější spustit akce pomocí příkazu xargs, který má modernější implementaci a lépe zvládne zpracovat dlouhé seznamy. Následují příkaz zajistí, že soubory s bílými znaky ve jméně nebudou rozděleny shellem:

find . -print0 | xargs -0 PŘÍKAZ

Seznam generovaný příkazem find je okamžitě předáván příkazu xargs, který spustí PŘÍKAZ se jmény souborů jako argumenty.

Reference

V tomto článku byl použit překlad textu z článku Find na anglické Wikipedii.