Linuxový příkaz find
Linux příkaz najít je velmi užitečný a šikovný příkaz pro vyhledávání souborů z příkazového řádku. Lze jej použít k vyhledání souborů na základě různých kritérií vyhledávání, jako jsou oprávnění, vlastnictví uživatele, datum/čas změny, velikost atd. V tomto příspěvku se naučíme používat příkaz find spolu s různými možnostmi, které podporuje.
Příkaz find je standardně dostupný na většině linuxových distribucí, takže nemusíte instalovat žádný balíček. Příkaz find je nezbytností, kterou se musíte naučit, pokud chcete být superproduktivní s příkazovým řádkem na linuxu.
Základní syntaxe příkazu find vypadá takto
$ find location comparison-criteria search-term
1. Seznam všech souborů v aktuálním a podadresáři
Tento příkaz vypíše všechny soubory v aktuálním adresáři a také podadresáře v aktuálním adresáři.
$ find . ./abc.txt ./subdir ./subdir/how.php ./cool.php
Příkaz je stejný jako následující
$ find . $ find . -print
2. Vyhledejte konkrétní adresář nebo cestu
Následující příkaz vyhledá soubory v adresáři test v aktuálním adresáři. Ve výchozím nastavení vypíše všechny soubory.
$ find ./test ./test ./test/abc.txt ./test/subdir ./test/subdir/how.php ./test/cool.php
Následující příkaz vyhledává soubory podle jejich názvu.
$ find ./test -name "abc.txt" ./test/abc.txt
Můžeme také použít zástupné znaky
$ find ./test -name "*.php" ./test/subdir/how.php ./test/cool.php
Všimněte si, že všechny podadresáře jsou prohledávány rekurzivně. Jedná se tedy o velmi účinný způsob, jak najít všechny soubory dané přípony.
Pokus prohledat adresář "/", který je kořenem, by prohledal celý souborový systém včetně připojených zařízení a síťových úložných zařízení. Buď opatrný. Samozřejmě můžete kdykoli příkaz zastavit stisknutím Ctrl + c.
When specifying the directory ("./test" in this example), its fine to omit the trailing slash. However, if the directory is actually a symlink to some other location then you MUST specify the trailing slash for it to work properly (find ./test/ ...)
Ignorujte případ
Při hledání názvů souborů je často užitečné ignorovat velikost písmen. Chcete-li ignorovat malá a velká písmena, použijte místo možnosti "name" možnost "jméno".
$ find ./test -iname "*.Php" ./test/subdir/how.php ./test/cool.php
Its always better to wrap the search term (name parameter) in double or single quotes. Not doing so will seem to work sometimes and give strange results at other times.
3. Omezte hloubku procházení adresáře
Příkaz find ve výchozím nastavení prochází celým adresářovým stromem rekurzivně, což je náročné na čas a zdroje. Lze však zadat hloubku procházení adresáře. Například nechceme jít v podadresářích o více než 2 nebo 3 úrovně níže. To se provádí pomocí možnosti maxdepth.
$ find ./test -maxdepth 2 -name "*.php" ./test/subdir/how.php ./test/cool.php $ find ./test -maxdepth 1 -name *.php ./test/cool.php
Druhý příklad používá maxdepth 1, což znamená, že nepůjde níže než 1 úroveň hluboko, a to buď pouze v aktuálním adresáři.
To je velmi užitečné, když chceme provádět omezené vyhledávání pouze v aktuálním adresáři nebo maximálně 1 úrovni hlubokých podadresářů a ne v celém stromu adresářů, což by zabralo více času.
Stejně jako maxdepth existuje možnost nazvaná mindepth, která dělá to, co název napovídá, to znamená, že před vyhledáním souborů půjde alespoň N úrovně hluboko.
4. Invertovat shodu
Je také možné vyhledávat soubory, které neodpovídají danému názvu nebo vzoru. To je užitečné, když víme, které soubory z vyhledávání vyloučit.
$ find ./test -not -name "*.php" ./test ./test/abc.txt ./test/subdir
Ve výše uvedeném příkladu jsme tedy našli všechny soubory, které nemají příponu php, buď soubory jiné než php. Příkaz find také podporuje vykřičník místo not.
find ./test ! -name "*.php"
5. Kombinujte více kritérií vyhledávání
Při zadávání názvu a invertování je možné použít více kritérií. Například
$ find ./test -name 'abc*' ! -name '*.php' ./test/abc.txt ./test/abc
Výše uvedený příkaz find hledá soubory, které v názvu začínají na abc a nemají příponu php. Toto je příklad toho, jak výkonné vyhledávací výrazy lze vytvořit pomocí příkazu find.
Operátor NEBO
Při použití více kritérií názvů by je příkaz find spojil s operátorem AND, což znamená, že budou nalezeny pouze ty soubory, které splňují všechna kritéria. Pokud však potřebujeme provést párování založené na OR, pak má příkaz find přepínač "o".
$ find -name '*.php' -o -name '*.txt' ./abc.txt ./subdir/how.php ./abc.php ./cool.php
Výše uvedený příkaz vyhledá soubory končící buď příponou php, nebo příponou txt.
6. Prohledávat pouze soubory nebo pouze adresáře
Někdy chceme najít pouze soubory nebo pouze adresáře s daným názvem. Find to dokáže také snadno.
$ find ./test -name abc* ./test/abc.txt ./test/abc Only files $ find ./test -type f -name "abc*" ./test/abc.txt Only directories $ find ./test -type d -name "abc*" ./test/abc
Docela užitečné a praktické!
7. Prohledejte více adresářů společně
Řekněme, že chcete hledat ve 2 samostatných adresářích. Příkaz je opět velmi jednoduchý
$ find ./test ./dir2 -type f -name "abc*" ./test/abc.txt ./dir2/abcdefg.txt
Zkontrolujte, že jsou uvedeny soubory ze 2 samostatných adresářů.
8. Najít skryté soubory
Skryté soubory v linuxu začínají tečkou. Takže je snadné to zmínit v kritériích názvu a seznamu všech skrytých souborů.
$ find ~ -type f -name ".*"
9. Najít soubory s určitými oprávněními
Příkaz find lze použít k vyhledání souborů se specifickým oprávněním pomocí možnosti „perm“. Následující příkaz vyhledává soubory s oprávněním 0664
$ find . -type f -perm 0664 ./abc.txt ./subdir/how.php ./abc.php ./cool.php
To může být užitečné při hledání souborů s nesprávnými oprávněními, což může vést k bezpečnostním problémům. Inverze lze také použít na kontrolu oprávnění.
$ find . -type f ! -perm 0777 ./abc.txt ./subdir/how.php ./abc.php ./cool.php
10. Najděte soubory s nastavenými bity sgid/suid
Možnost "perm" příkazu find přijímá stejný řetězec režimu jako chmod. Následující příkaz najde všechny soubory s oprávněním 644 a nastaveným bitem sgid.
# find / -perm 2644
Podobně použijte 1664 pro lepivý bit. Možnost perm také podporuje použití alternativní syntaxe místo osmičkových čísel.
$ find / -maxdepth 2 -perm /u=s 2>/dev/null /bin/mount /bin/su /bin/ping6 /bin/fusermount /bin/ping /bin/umount /sbin/mount.ecryptfs_private
Všimněte si, že "2>/dev/null" odstraní ty položky, které mají chybu "Permission Denied"
11. Najít soubory pouze pro čtení
Najít všechny soubory pouze pro čtení.
$ find /etc -maxdepth 1 -perm /u=r /etc /etc/thunderbird /etc/brltty /etc/dkms /etc/phpmyadmin ... output truncated ...
12. Najděte spustitelné soubory
Následující příkaz vyhledá spustitelné soubory
$ find /bin -maxdepth 2 -perm /a=x /bin /bin/preseed_command /bin/mount /bin/zfgrep /bin/tempfile ... output truncated ...
13. Najít soubory vlastněné konkrétním uživatelem
Chcete-li najít celý nebo jeden soubor s názvem tecmint.txt v adresáři /root kořenového adresáře vlastníka.
$ find . -user bob . ./abc.txt ./abc ./subdir ./subdir/how.php ./abc.php
Můžeme také zadat název souboru nebo jakákoli kritéria související s názvem spolu s uživatelskými kritérii
$ find . -user bob -name '*.php'
Je velmi snadné vidět, jak můžeme sestavit kritéria za kritérii, abychom zúžili hledání odpovídajících souborů.
14. Vyhledejte soubory patřící do skupiny
Najděte všechny soubory, které patří do určité skupiny.
# find /var/www -group developer
Věděli jste, že můžete prohledávat svůj domovský adresář pomocí symbolu ~?
$ find ~ -name "hidden.php"
Snadno!!
Vyhledávání souborů a adresářů podle data a času změny
Dalším skvělým vyhledávacím kritériem, které příkaz find podporuje, je úprava a přístupové datum/časy. To je velmi užitečné, když chceme zjistit, které soubory byly upraveny v určitém časovém nebo časovém rozmezí. Vezměme si několik příkladů
15. Najít soubory upravené před N dny
Chcete-li najít všechny soubory, které byly změněny před 50 dny.
# find / -mtime 50
16. Najít soubory, ke kterým se přistupovalo za posledních N dní
Najít všechny soubory, ke kterým se přistupovalo za posledních 50 dní.
# find / -atime 50
17. Najít soubory upravené v rozmezí dnů
Najděte všechny soubory, které byly změněny před 50 až 100 dny.
# find / -mtime +50 –mtime -100
18. Najít soubory změněné za posledních N minut.
Najít soubory upravené během poslední 1 hodiny.
$ find /home/bob -cmin -60
19. Soubory upravené za poslední hodinu
Chcete-li najít všechny soubory, které byly změněny za poslední 1 hodinu.
# find / -mmin -60
20. Najít přístupné soubory za poslední 1 hodinu
Chcete-li najít všechny soubory, ke kterým se přistupovalo za poslední 1 hodinu.
# find / -amin -60
21. Najít soubory dané velikosti
Prohledávejte soubory a adresáře podle velikosti. Chcete-li najít všechny 50 MB soubory, použijte.
# find / -size 50M
22. Najděte soubory v rozsahu velikostí
Chcete-li najít všechny soubory, které jsou větší než 50 MB a menší než 100 MB.
$ find / -size +50M -size -100M
23. Najděte největší a nejmenší soubory
Příkaz find při použití v kombinaci s příkazy ls a sort lze použít k výpisu největších souborů.
Následující příkaz zobrazí 5 největších souborů v aktuálním adresáři a jeho podadresáři. Spuštění může chvíli trvat v závislosti na celkovém počtu souborů, které musí příkaz zpracovat.
$ find . -type f -exec ls -s {} \; | sort -n -r | head -5
Podobně při seřazení ve vzestupném pořadí by se nejprve zobrazily nejmenší soubory
$ find . -type f -exec ls -s {} \; | sort -n | head -5
24. Najděte prázdné soubory a adresáře
Následující příkaz používá volbu "empty" příkazu find, která najde všechny soubory, které jsou prázdné.
# find /tmp -type f -empty
Pro uložení všech prázdných adresářů použijte typ "d".
$ find ~/ -type d -empty
Opravdu velmi jednoduché a snadné
Některé pokročilé operace
Příkaz find nejen najde soubory na základě určitých kritérií, ale může s těmito soubory také jednat pomocí libovolného linuxového příkazu. Můžeme například chtít odstranit některé soubory.
Zde je několik rychlých příkladů
25. Vypište nalezené soubory
Řekněme, že jsme našli soubory pomocí příkazu find a nyní je chceme vypsat tak, jak by to udělal příkaz ls. To je velmi snadné.
$ find . -exec ls -ld {} \; drwxrwxr-x 4 enlightened enlightened 4096 Aug 11 19:01 . -rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./abc.txt drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:48 ./abc drwxrwxr-x 2 enlightened enlightened 4096 Aug 11 16:26 ./subdir -rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:26 ./subdir/how.php -rw-rw-r-- 1 enlightened enlightened 29 Aug 11 19:13 ./abc.php -rw-rw-r-- 1 enlightened enlightened 0 Aug 11 16:25 ./cool.php
26. Smažte všechny odpovídající soubory nebo adresáře
Následující příkaz odstraní všechny textové soubory v adresáři tmp.
$ find /tmp -type f -name "*.txt" -exec rm -f {} \;
Stejné operace lze provádět s adresáři, stačí zadat typ d místo typu f.
Vezměme si další příklad, kdy chceme smazat soubory větší než 100 MB
$ find /home/bob/dir -type f -name *.log -size +10M -exec rm -f {} \;
Shrnutí
Takže to byl rychlý návod na příkaz linux find . Příkaz find je jedním z nejdůležitějších příkazů na linuxovém terminálu, který umožňuje velmi snadné vyhledávání souborů. Je to povinnost všech systémových administrátorů. Tak se to naučte. Máte nějaké otázky ? Zanechte komentář níže.