Jak používat příkazy Find a Locate k vyhledávání souborů v Linuxu

author
9 minutes, 38 seconds Read

Ú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
Output
1111

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. . .

Vykonávání a kombinování příkazů pro vyhledávání

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
Output
Database /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.

Similar Posts

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.