find
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.
Typ softwaru | standardní UNIXová utilita či příkaz |
---|---|
Některá data mohou pocházet z datové položky. |
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.