Příkaz find
v Linuxu představuje robustní nástroj, který umožňuje systémovým administrátorům efektivně vyhledávat a spravovat soubory a složky na základě komplexních kritérií. Můžete s ním vyhledávat soubory a adresáře podle jejich názvu, typu, přípony, velikosti, přístupových práv a mnoha dalších atributů.
Kromě pouhého vyhledávání umožňuje find
v kombinaci s dalšími nástroji provádět akce na základě získaných výsledků. S volbou -exec
mohou administrátoři spouštět externí příkazy a provádět operace, jako je kopírování, přesun, mazání či změna přístupových práv u souborů a složek, které odpovídají definovaným kritériím, jako je například velikost či název.
V tomto článku si nejprve vysvětlíme základy příkazu find
s ilustrativními příklady. Ukážeme si, jak nalézt soubory a složky. Následně si předvedeme, jak s pomocí volby -exec
provádět specifické operace se soubory a složkami na základě jejich charakteristik, jako jsou velikost nebo přístupová práva.
Obecná syntaxe příkazu find
vypadá následovně:
find {cesta} {název-souboru-nebo-složky-k-vyhledání} {akce-ke-provedení}
Kde:
cesta
definuje adresář, ve kterém se má hledat.název-souboru-nebo-složky-k-vyhledání
je název hledaného souboru nebo složky.akce-ke-provedení
označuje operaci, která má být provedena, jako například kopírování, mazání nebo přesun.
V tomto tutoriálu si rozebereme, jak hledat soubory a složky, které vyhovují zadaným vzorům. Také si ukážeme, jak provádět akce se soubory a složkami, které příkaz find
identifikuje. Tento průvodce je založen na systému Ubuntu, ale je aplikovatelný na většinu distribucí a verzí Linuxu.
Vyhledávání souborů a adresářů
Vyhledávání souborů podle názvu nebo přípony
Pro vyhledání konkrétního souboru spustíte následující příkaz z kořenového adresáře (/
). Příkaz zahrnuje přesný název souboru, který hledáte.
find . -name file22.txt
Výstup:
./test/file22.txt ./sales/file22.txt
Všimněte si, že výsledek obsahuje i cestu k souboru. To je důležité, pokud si nejste jisti, ve kterém adresáři se soubor nachází, nebo pokud existuje na více místech.
Soubor můžete vyhledat i v jiném adresáři, přestože se nacházíte v aktuálním umístění. V takovém případě musíte zadat cestu k adresáři, ve kterém chcete hledat.
find ./test -name file22.txt
Vyhledávání specifických souborů v jiném adresáři
V našem případě budeme v adresáři test
hledat všechny soubory začínající slovem „file“.
find ./test -name file*
Výstup:
./test/file22.txt ./test/file30.doc ./test/file1.txt ./test/file5,doc
Vyhledávání souborů podle přípony
Pokud chcete v Linuxu vyhledat soubory s určitou příponou, zadejte ji do příkazu.
find . -name *.txt
Výstup:
./test/subtest/subfil.txt ./test/file22.txt ./test/file1.txt ./home1/files32.txt ./home2/file22.txt ./qa/tags.txt
Vyhledávání souborů a složek podle názvu
Pomocí níže uvedeného příkazu vyhledejte soubory a složky začínající písmeny qa
. V našem počítači máme soubory qatree.txt
a qa.txt
a také složku s názvem qa
.
Pokud spustíme příkaz:
find ./ -name "qa*"
Výsledkem bude tento výstup:
./test/qatree.pdf ./test/qa.txt ./home/qa
Příkaz vrací jak soubory, tak složky odpovídající kritériím hledání. Pokud chcete vyhledat pouze soubory nebo jen složky, musíte to v příkazu specifikovat.
Vyhledání pouze souborů nebo pouze složek
Pro vyhledání pouze souborů použijte přepínač -type f
.
Pouze soubory:
find ./ -type f -name "qa*"
Výstup:
./test/qatree.pdf ./test/qa.txt
Pouze složky:
Pro vyhledání pouze složek přidejte volbu -type d
.
find ./ -type d -name "qa*"
Výstup:
./home/qa
Příkaz hledání nerozlišující velikost písmen
Všechna hledání s přepínačem -name
rozlišují malá a velká písmena a nenajdou shodné položky s rozdílnou velikostí písmen. Pro získání všech případů použijte volbu -iname
.
find ./ -iname "qa*"
Výstup:
./test/qatree.pdf ./test/qa.txt ./test/QAtest.txt ./home/qa
Vyhledávání souborů z více adresářů
Chcete-li vyhledávat soubory v různých adresářích, přidejte jejich cesty do příkazu. V našem případě prohledáme adresáře test
a numeric
.
find ./test ./numeric -name file22.txt -type f
Výstup:
./test/file22.txt /root/numeric/file22.txt
Vyhledávání více souborů s různými příponami ze všech adresářů
Příkaz find
můžete použít k vyhledání více souborů, které mají různé přípony, jako jsou *.doc
, *.txt
, *.pdf
atd. Můžete to provést buď samostatně, jednu příponu po druhé, nebo pomocí jediného příkazu, který zahrne všechna požadovaná rozšíření.
find . -type f ( -name "*.txt" -o -name "*.pdf" -o -name "*.doc" )
Výstup:
./test/subtest/subfil.txt ./test/qatree.pdf ./test/file22.txt ./test/qa.txt ./test/file30.doc ./books/acro.pdf ./data1/FILE22.txt ./docs/files32.txt
Vyhledávání souborů obsahujících konkrétní text
Někdy potřebujete získat přístup k souboru, který obsahuje určitý text, ale nemůžete si vzpomenout na jeho název nebo umístění. Tento příkaz vám umožní najít všechny soubory obsahující váš cílový text.
Chcete-li vyhledat všechny soubory obsahující slovo „hyperkonvergence“, použijte:
find / -type f -exec grep -l -i "hyperconvergence" {} ;
Výstup:
/root/numeric/hci /root/HCIP
Volba -i
umožňuje příkazu ignorovat malá a velká písmena a najde text bez ohledu na to, zda je napsán velkými písmeny, tedy hyperkonvergence
, Hyperkonvergence
atd.
Chcete-li vyhledat soubory v určitém adresáři, jednoduše jej přidejte do příkazu:
find ./numeric -type f -exec grep -l -i "hyperconvergence" {} ;
Výstup:
./numeric/hci
Prozkoumejte další příklady příkazů grep.
Vyhledávání souborů a adresářů podle velikosti
Můžete vyhledat všechny soubory nebo adresáře, které jsou menší, stejně velké nebo větší než určitá velikost, případně vyhledat soubory v určitém rozsahu nebo prázdné. Použijte vhodný formát velikosti v závislosti na typu souborů nebo adresářů, které hledáte.
Možnosti velikosti zahrnují:
c
– bajtyk
– kilobajtyM
– megabajtyG
– gigabajty
Vyhledávání souborů o konkrétní velikosti – rovnající se 30 MB
Pro vyhledání všech souborů o velikosti 30 MB použijte:
find / -size 30M
Vyhledání souborů větších než zadaná velikost
find -size +2M
Výstup:
. /Downloads/ubuntu18043.iso ./.cache/pip/http/6/e/3/8/3/6e38383f41850c3e5705d48116bc52f81b92a80500f414305057 7a9c
Vyhledání souborů menších než 10 MB v aktuálním adresáři
find . -type f -size -10M
Vyhledání souborů o velikosti mezi 100–200 MB
Při hledání souborů v určitém rozsahu, například mezi 100 a 200 MB, použijte:
find / -size +100M -size -200M
Vyhledání složek větších než 20 kB
find / -type d -size +20k
Vyhledání prázdných souborů a adresářů
Soubory:
find ./ -type f -size 0
nebo
find ./ -type f --empty
Složky:
find ./ -type d --empty
Vyhledávání souborů podle stáří nebo času úprav
Vyhledání souborů starších než n
dní:
find /cesta/ -type f -name '*.txt' -mtime +8
-mtime +8
vyhledá soubory .txt
, které jsou starší než 8 dní.
Vyhledávání podle data změny
Tento příkaz vyhledá soubory upravené za posledních 17 hodin:
find . -mtime -17 -type f
Vyhledá adresáře upravené za posledních 10 dní:
find . -mtime -10 -type d
Vyhledání souborů na základě přístupu nebo úprav
Vyhledání souborů podle data nebo času přístupu. To vám umožní zobrazit soubory, které byly nebo nebyly zpřístupněny během zadaného období.
Chcete-li zobrazit soubory, které nebyly zpřístupněny během posledních 10 dnů v domovském adresáři, použijte:
find /home -atime +10
Soubory zpřístupněné přesně před 10 dny:
find /home -atime 10
Soubory zpřístupněné za posledních 10 dní:
find /home -atime -10
Vyhledání souborů upravených během posledních n
dní
Můžete také vyhledat soubory v adresáři /home
změněné během posledních 10 dnů pomocí příkazu:
find /home -mtime -10
Vyhledání souborů upravených v určitém období
Například všechny soubory upravené mezi 6 a 15 dny v domovském adresáři:
find /home -type f -mtime +6 -mtime -15
Soubory a adresáře zpřístupněné za posledních 10 minut
Pro vyhledání souborů, ke kterým se přistupovalo za posledních 10 minut, použijte volbu -amin
.
find . -amin -10 -type f
Výstup:
./.bash_history ./[email protected]:~#
Adresáře zpřístupněné během posledních 10 minut:
find . -amin -10 -type d
Vyhledávání souborů odpovídajících specifickým oprávněním
Syntaxe:
$ find -perm mode
Kde mode
je oprávnění, které může být buď číselné, například 644
, 655
, 700
, 777
atd., nebo písmenné, jako u=x
, a=r+x
atd.
Režim můžete zadat třemi různými způsoby:
- Bez předpony, pokud chcete najít soubory s přesně zadanými oprávněními.
- S
-
pro soubory s alespoň zadanými oprávněními. Toto vrátí soubory se zadanými i dalšími vyššími oprávněními. - S
/
vyžaduje zadání vlastníka nebo skupiny s oprávněním k souboru.
Vyhledání souborů s oprávněními 777
find -perm 777
Výstup:
./file1
Vyhledání souborů s alespoň 766:
find -perm -766
Výstup:
./file2 ./file1
Příkaz hledá všechny soubory, kde platí:
- Vlastník souboru má oprávnění pro čtení, zápis i spouštění.
- Skupina má oprávnění pro čtení i zápis.
- Ostatní mají oprávnění pro čtení i zápis.
Proto vrátí dva soubory, které splňují toto kritérium – file1
a file2
. Soubory nemusí mít přesná oprávnění 766, mohou mít i další, ale musí mít alespoň specifikovaná.
Vyhledání souborů, do kterých může zapisovat vlastník
Nyní použijeme /
k vyhledání souborů, do kterých může zapisovat jejich vlastník, skupina nebo jiní uživatelé.
find -perm /222
Výstup:
. ./file2 ./file3 ./file1
Výše uvedený příkaz hledá soubory, do kterých může zapisovat buď vlastník, nebo skupina. Vrátí soubory, do kterých lze zapisovat buď jedním, nebo oběma, ale ne nutně oběma. Chcete-li zobrazit soubory, kde mají oba oprávnění k zápisu, použijte předponu -
.
find -perm -220
Výstup:
./file2 ./file1
Vyhledání souborů vlastněných uživatelem
Vyhledání všech souborů vlastněných uživatelem Jack:
find /home -user jack
Výstup:
/home/jack /home/jack/examples.desktop /home/jack/.gnupg /home/jack/.gnupg/private-keys-v1.d /home/jack/ans.cgi
Vyhledání konkrétních souborů vlastněných uživatelem
Vyhledání všech textových souborů vlastněných uživatelem Jack:
find /home -user jack -iname "*.txt"
Výstup:
/home/jack/docs/file32.txt
Vyhledání a vypsání souborů a složek spolu s jejich oprávněními
find -name "*.conf" | ls -l
Výstup:
total 120 drwxr-xr-x 2 root root 4096 Dec 31 13:19 backup2 drwxr-xr-x 2 root root 4096 Jan 4 11:57 Desktop drwxr-xr-x 2 root root 4096 Dec 31 11:50 Documents drwxr-xr-x 2 root root 4096 Dec 31 12:27 Downloads -rw-r--r-- 1 root root 0 Jan 4 12:02 file22.doc drwxr-xr-x 2 root root 4096 Jan 4 12:14 file23 -rw-r--r-- 1 root root 0 Jan 4 12:23 file23.txt
Vyhledávání výsledků a práce s nimi
V této části se podíváme na to, jak můžete pracovat se soubory, které odpovídají vzoru zadanému v příkazu find
.
Vyhledání souborů a změna jejich oprávnění
Vyhledání a změna oprávnění u specifických typů souborů. V našem případě budeme pracovat se soubory PHP s různými oprávněními, jak je uvedeno níže.
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rw-rw-r-- 1 jack jack 0 Jan 3 14:11 vary.php
Nyní vyhledáme všechny soubory PHP (výše) a nastavíme jejich oprávnění na 755
:
find ver -name "*.php" -type f -exec chmod 755 {} ;
Příkaz vyhledá soubory PHP v adresáři ver
a následně nastaví jejich oprávnění na 755 (rwxr-xr-x
).
Výsledek:
[email protected]:~/ver$ ls -la total 8 drwxrwxr-x 2 jack jack 4096 Jan 3 14:11 . drwxr-xr-x 8 jack jack 4096 Jan 3 14:05 .. -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 ans.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 base.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 query.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 qust.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:06 text.php -rwxr-xr-x 1 jack jack 0 Jan 3 14:11 vary.php
Vyhledání a změna oprávnění u souborů a adresářů
Vyhledání souborů s oprávněními 644
a změna na 655
:
find . -type f -perm 644 -exec chmod 655 {} ;
Můžete také vyhledat adresáře s oprávněními 644
a nastavit je na 755
.
find . -type d -perm 644
Výstup:
./docs
Složka docs
má oprávnění 644
:
drwxrwxr-x 2 jack jack 4096 Jan 3 12:45 docs
Abychom ji nastavili na 755
, spustíme:
find . -type d -perm 644 -exec chmod 755 {} ;
Nyní můžeme znovu zkontrolovat, co má přesně 755
:
find . -type d -perm 755
Výstup:
./ ./docs
Z výše uvedeného vidíme, že kořenový adresář a adresář docs
mají oprávnění 755
.
Příkaz ls -la
poskytuje následující podrobnosti:
drwxr-xr-x 2 jack jack 4096 Jan 3 12:45 docs
Vyhledání a kopírování souborů nebo adresářů
Vyhledání a kopírování konkrétního souboru do adresáře:
Následující příkaz vyhledá soubor file22.txt
a zkopíruje jej do adresáře ~/tmp/images
.
find -iname file22.txt -exec cp {} ~/tmp/images ;
Vyhledání a kopírování jednoho typu souborů do adresáře:
Chcete-li vyhledat soubory, například obrázky s příponou .jpg
, v aktuálním adresáři a zkopírovat je do jiného umístění, například do složky images
, použijte:
find -iname '*.jpg' -exec cp {} ~/tmp/images ;
Tím se vyhledají a zkopírují všechny soubory .jpg
do složky ~/tmp/images
.
Vyhledání a kopírování jednoho souboru do mnoha adresářů
Vyhledání a kopírování jednoho souboru do více adresářů:
find ~/tmp/dir1/ ~/tmp/dir2/ $HOME/3/ -maxdepth 0 -exec cp ~/numeric/hci {} ;
Tím se vyhledá soubor hci
a zkopíruje se do tří adresářů: /tmp/dir1/
, /tmp/dir2/
a $HOME/3/
.
Vyhledání a přesun souborů do jiného adresáře
Přesun známého souboru z jednoho adresáře do jiného. Chcete-li přesunout soubor universal.php
:
find ~/folder/ -type f -name universal.php -exec mv {} ~/numeric/ ;
Vyhledání a přesun souborů s určitou příponou do jiné složky:
find ~/numeric/ -type f -name '*.php' -exec mv {} ~/folder/ ;
Vyhledání specifických souborů a jejich přesun do určité jiné složky
find -type f -name uni*.* -exec mv {} ~/unifiles/ ;
Příkaz vyhledá všechny soubory, jejichž názvy začínají na uni
a mají libovolnou příponu. Poté je přesune do adresáře /unifiles/
.
Vyhledání a přesun souborů podle stáří
Vyhledání a přesun souborů starších než zadaný počet dní do jiného umístění, například do archivu.
find /cesta/ -type f -name '*.pdf' -mtime +20 -exec mv {} /backup1/ ;
Tím se vyhledají soubory .pdf
starší než 20 dní a přesunou se do adresáře backup1
.
Vyhledávání a odstranění souborů a adresářů
Syntaxe pro vyhledání a odstranění souborů nebo adresářů v aktuálním adresáři je:
find . -type f -name "soubor-k-odstranění" -exec rm -f {} ;
pro odstranění pouze souborů nebo
find . -type d -name "složka-k-odstranění" -exec rm -rf {} ;
pro odstranění pouze adresářů.
Vyhledání a odstranění pouze specifických souborů
Pro vyhledání a odstranění souborů začínajících na til
použijte:
find . -type f -name "til*" -exec rm {} ;
Pro vyhledání a odstranění adresářů začínajících na til
:
find . -type d -name "til*" -exec rm {} ;
Odstranění souborů i adresářů
find . -name "til*" -exec rm -rf {} ;
Tím se odstraní soubory i adresáře začínající písmeny til
.
Odstranění podle přípony
Následuje ukázka, jak vyhledat a odstranit všechny soubory .txt
v aktuálním adresáři. Nahraďte txt
jinou příponou, jako je bak
, pdf
nebo kterákoli jiná, kterou chcete odstranit.
find . -type f -name "*.txt" -exec rm -f {} ;
Pokud chcete, aby se systém před smazáním každého souboru zeptal na potvrzení, přidejte volbu -i
, jak je uvedeno níže:
find . -type f -name "*.txt" -exec rm -i {} ;
Výstup:
rm: remove regular empty file './File22.txt'? y rm: remove regular empty file './file22.txt'? y rm: remove regular empty file './file23.txt'?
Ve výchozím nastavení -rm
neodstraní adresáře a pro rekurzivní odstranění musíte použít volbu -r
. Tím je zajištěno odstranění prázdných adresářů a adresářů obsahujících soubory. Volba -f
vynutí odstranění a používá se pro soubory i adresáře.
Vyhledání a odstranění souborů starších než n
dní
Vyhledání a odstranění záložních souborů starších než 20 dní z aktuálního adresáře.
find . -type f -name '*.bak' -mtime +20 -exec rm {} ;
Tím se smažou všechny soubory .bak
starší než 20 dní.
Vyhledání a odstranění pouze adresářů
Pro odstranění adresáře s názvem dir22
:
find . -type d -name dir22 -exec rm -rf {} ;
Ujistěte se, že odpovídá velikosti názvu adresáře nebo použijte volbu -iname
.
find . -type d -iname Dir22 -exec rm -rf {} ;
Odstraní Dir22
i dir22
.
Pro potvrzení před odstraněním použijte volbu -i
:
find . -type d -iname Dir