Úvod
Jedním z problémů, na které uživatelé narážejí při první práci s počítačem se systémem Linux, je, jak najít hledané soubory.
Tento průvodce se zabývá používáním příhodně pojmenovaného příkazu find
. Ten vám pomůže vyhledat soubory na vašem VPS pomocí různých filtrů a parametrů. Stručně se budeme zabývat také příkazem locate
, který lze použít k vyhledávání souborů jiným způsobem.
Vyhledávání podle názvu
Nejzřejmějším způsobem vyhledávání souborů je vyhledávání podle názvu.
Chcete-li najít soubor podle názvu, zadejte:
- find -name "query"
Při vyhledávání se rozlišují malá a velká písmena, což znamená, že vyhledávání file
je jiné než vyhledávání File
.
Chcete-li najít soubor podle názvu, ale ignorovat velikost písmen v dotazu, zadejte:
- find -iname "query"
Pokud chcete najít všechny soubory, které se nedrží určitého vzoru, můžete vyhledávání invertovat pomocí -not
nebo !
. Pokud použijete !
, musíte znak escapovat, aby se jej bash nepokusil interpretovat dříve, než bude moci find jednat:
- find -not -name "query_to_avoid"
Nebo
- find \! -name "query_to_avoid"
Vyhledávání podle typu
Typ souborů, které chcete najít, můžete určit pomocí parametru -type
. Funguje to takto:
- find -type type_descriptor query
Některé z nejběžnějších deskriptorů, které můžete použít k určení typu souboru, jsou zde:
-
f: běžný soubor
-
d: adresář
-
l: symbolický odkaz
-
c: znakové zařízení
-
b: bloková zařízení
Pokud bychom například chtěli najít všechna znaková zařízení v našem systému, mohli bychom zadat tento příkaz:
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
Všechny soubory, které končí na .conf
, můžeme vyhledat takto:
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
Filtrování podle času a velikosti
Find nabízí řadu způsobů filtrování výsledků podle velikosti a času.
Velikost
Filtrovat podle velikosti můžete pomocí parametru -size
.
Na konec naší hodnoty přidáme příponu, která určuje způsob počítání. Toto jsou některé oblíbené možnosti:
-
c: bajty
-
k: Kilobajty
-
M: Megabajty
-
G: Gigabajty
-
b: 512bajtové bloky
Chceme-li najít všechny soubory, které mají přesně 50 bajtů, zadáme:
- find / -size 50c
Chceme-li najít všechny soubory menší než 50 bajtů, můžeme místo toho použít tento tvar:
- find / -size -50c
Chceme-li najít všechny soubory větší než 700 megabajtů, můžeme použít tento příkaz:
- find / -size +700M
Čas
Linux ukládá časové údaje o časech přístupu, změnách a změnách.
-
Čas přístupu:
-
Čas změny:
-
Čas změny:
Tyto parametry můžeme použít s parametry -atime
, -mtime
a -ctime
. Ty mohou používat symboly plus a minus k určení větší než nebo menší než, podobně jako jsme to udělali u parametru size.
Hodnota tohoto parametru určuje, před kolika dny chcete vyhledávat.
Chceme-li vyhledat soubory, které mají dobu změny před jedním dnem, zadáme:
- find / -mtime 1
Pokud chceme soubory, ke kterým byl přístup před méně než jedním dnem, můžeme zadat:
- find / -atime -1
Chceme-li získat soubory, u kterých byly naposledy změněny metainformace před více než 3 dny, zadáme:
- find / -ctime +3
Existují také doprovodné parametry, které můžeme použít k zadání minut místo dnů:
- find / -mmin -1
Tímto způsobem získáme soubory, jejichž typ byl změněn v poslední minutě.
Find může také provést porovnání s referenčním souborem a vrátit ty, které jsou novější:
- find / -newer myfile
Vyhledávání podle vlastníka a oprávnění
Soubory můžete vyhledávat také podle vlastníka souboru nebo vlastníka skupiny.
To provedete pomocí parametrů -user
, respektive -group
. Soubor, jehož vlastníkem je uživatel „syslog“, vyhledáme zadáním:
- find / -user syslog
Podobně můžeme zadat soubory, jejichž vlastníkem je skupina „shadow“, zadáním:
- find / -group shadow
Můžeme také vyhledávat soubory se specifickými oprávněními.
Pokud chceme zadat přesnou sadu oprávnění, použijeme tento tvar:
- find / -perm 644
Tento tvar zadá soubory s přesně zadanými oprávněními.
Pokud chceme zadat cokoli s alespoň těmito oprávněními, můžeme použít tento tvar:
- find / -perm -644
Tento tvar zadá všechny soubory, které mají další oprávnění. V tomto případě by byl přiřazen soubor s právy „744“.
Filtrování podle hloubky
Pro tuto část vytvoříme adresářovou strukturu v dočasném adresáři. Bude obsahovat tři úrovně adresářů, přičemž na první úrovni bude deset adresářů. Každý adresář (včetně dočasného adresáře) bude obsahovat deset souborů a deset podadresářů.
Tuto strukturu vytvoříme následujícími příkazy:
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
Neváhejte a prohlédněte si adresářové struktury pomocí ls
a cd
, abyste si udělali představu o uspořádání. Až budete hotovi, vraťte se do testovacího adresáře:
- cd ~/test
Pracujeme na tom, jak z této struktury vrátit konkrétní soubory. Pro srovnání si nejprve vyzkoušíme příklad jen s běžným vyhledáváním podle názvu:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
Výsledků je hodně. Pokud výstup přepíšeme do čítače, zjistíme, že je zde celkem 1111 výsledků:
- find -name file1 | wc -l
Output1111
To je pravděpodobně příliš mnoho výsledků na to, aby pro vás byly za většiny okolností užitečné. Zkusme to zúžit.
Můžete zadat maximální hloubku vyhledávání pod adresářem nejvyšší úrovně:
- find -maxdepth num -name query
Chcete-li najít „soubor1“ pouze v adresářích „úrovně1“ a výše, můžete zadat maximální hloubku 2 (1 pro adresář nejvyšší úrovně a 1 pro adresáře úrovně1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
Takový seznam je mnohem lépe zvládnutelný.
Můžete také zadat minimální adresář, pokud víte, že všechny soubory existují za určitým bodem pod aktuálním adresářem:
- find -mindepth num -name query
Můžeme to použít k nalezení pouze souborů na konci větví adresářů:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
Znovu, kvůli naší větvené adresářové struktuře to vrátí velký počet výsledků (1000).
Můžete kombinovat parametry min a max hloubky, abyste se zaměřili na úzký rozsah:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
Pomocí parametru -exec
můžete vykonat libovolný pomocný příkaz na vše, co vyhledávání odpovídá. Ten se volá takto:
- find find_parameters -exec command_and_params {} \;
Příkaz {}
se používá jako zástupný příkaz pro soubory, kterým nalezení odpovídá. Parametr \;
se používá proto, aby find věděl, kde příkaz končí.
Například bychom mohli najít soubory v předchozí části, které měly oprávnění 644
, a upravit je na oprávnění 664
:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Právnění adresářů bychom pak mohli změnit takto:
- find . -type d -perm 755 -exec chmod 700 {} \;
Pokud chcete řetězit různé výsledky, můžete použít příkazy -and
nebo -or
. Příkaz -and
se předpokládá, pokud je vynechán.
- find . -name file1 -or -name file9
Vyhledání souborů pomocí příkazu Locate
Alternativou k použití příkazu find
je příkaz locate
. Tento příkaz je často rychlejší a dokáže snadno prohledat celý souborový systém.
V Debianu nebo Ubuntu můžete tento příkaz nainstalovat pomocí apt
:
- sudo apt install mlocate
V systému CentOS použijte místo něj dnf
:
- sudo dnf install mlocate
Důvod, proč je locate
rychlejší než find
, je ten, že se spoléhá na databázi souborů v souborovém systému.
Tato databáze se obvykle aktualizuje jednou denně pomocí skriptu cron, ale můžete ji aktualizovat ručně zadáním:
- sudo updatedb
Spustit tento příkaz nyní. Nezapomeňte, že databáze musí být vždy aktuální, pokud chcete najít nedávno získané nebo vytvořené soubory.
Chcete-li najít soubory pomocí funkce locate, jednoduše použijte tuto syntaxi:
- locate query
Výstup můžete filtrovat několika způsoby.
Například chcete-li vrátit pouze soubory obsahující samotný dotaz, místo abyste vrátili každý soubor, který má dotaz v adresářích, které k němu vedou, můžete použít příznak -b
pro prohledávání pouze „základního jména“:
- locate -b query
Chcete-li, aby locate vracel pouze výsledky, které stále existují v souborovém systému (které nebyly odstraněny mezi posledním voláním updatedb
a aktuálním voláním locate
), použijte příznak -e
:
- locate -e query
Chcete-li zobrazit statistiku informací, které locate katalogizoval, použijte příznak -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Závěr
Oba funkce find a locate jsou dobrými způsoby, jak najít soubory ve vašem systému. Je na vás, abyste se rozhodli, který z těchto nástrojů je v každé situaci vhodný.
Find a locate jsou výkonné příkazy, které lze posílit jejich kombinací s dalšími nástroji prostřednictvím pipeline. Experimentujte s filtrováním pomocí příkazů jako wc
, sort
a grep
.