Hogyan használjuk a Find és Locate parancsot fájlok keresésére Linuxon

author
10 minutes, 31 seconds Read

Bevezetés

A felhasználók egyik problémája, amikor először foglalkoznak egy Linux géppel, hogy hogyan találják meg a keresett fájlokat.

Ez az útmutató a találóan elnevezett find parancs használatával foglalkozik. Ennek segítségével különböző szűrők és paraméterek segítségével kereshetsz fájlokat a VPS-eden. Röviden kitérünk a locate parancsra is, amely más módon használható fájlok keresésére.

Keresés név alapján

A fájlok keresésének legkézenfekvőbb módja a név alapján történő keresés.

A fájl név alapján történő kereséséhez írja be:

  • find -name "query"

Ez a parancs a nagy- és kisbetűkre érzékeny, vagyis a file keresése más, mint a File keresése.

A fájl név szerinti kereséséhez, de figyelmen kívül hagyva a lekérdezés nagy- és kisbetűit, írja be:

  • find -iname "query"

Ha minden olyan fájlt meg akar találni, amely nem felel meg egy adott mintának, akkor a -not vagy ! segítségével megfordíthatja a keresést. Ha a !-t használja, akkor a karaktert escape-elnie kell, hogy a bash ne próbálja meg értelmezni, mielőtt a find cselekedni tudna:

  • find -not -name "query_to_avoid"

Or

  • find \! -name "query_to_avoid"

Típus szerinti keresés

A -type paraméterrel megadhatja a keresendő fájlok típusát. Ez így működik:

  • find -type type_descriptor query

Ezek a leggyakoribb leírók, amelyeket a fájl típusának megadására használhat, a következők:

  • f: normál fájl

  • d: könyvtár

  • l: szimbolikus hivatkozás

  • c: karakteres eszközök

  • b: block devices

Ha például az összes karakteres eszközt meg akarjuk találni a rendszerünkben, akkor ezt a parancsot adhatjuk ki:

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

Az összes .conf végű fájlra így kereshetünk:

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

Szűrés idő és méret szerint

A Find többféleképpen is szűrheti a találatokat méret és idő szerint.

Size

A -size paraméter használatával szűrhetünk méret szerint.

Adunk egy utótagot az értékünk végére, amely megadja, hogyan számolunk. Ezek néhány népszerű lehetőség:

  • c: byte

  • k: Kilobájt

  • M: Megabájt

  • G: Gigabájt

  • b: 512 bájtos blokkok

Az összes olyan fájl megkereséséhez, amelyek pontosan 50 bájtosak, írjuk be:

  • find / -size 50c

Az összes 50 bájtnál kisebb fájl megkereséséhez használhatjuk helyette ezt a formát:

  • find / -size -50c

A 700 megabájtnál nagyobb fájlok megtalálásához ezt a parancsot használhatjuk:

  • find / -size +700M

Time

A Linux tárolja az időadatokat a hozzáférési időkről, a módosítási időkről és a módosítási időkről.

  • A hozzáférési idő: A fájl utolsó olvasási vagy írási ideje.

  • Módosítási idő: A fájl tartalmának utolsó módosítása.

  • Módosítási idő: Utolsó időpont, amikor a fájl inode metaadatai megváltoztak.

Az -atime, -mtime és -ctime paraméterekkel együtt használhatjuk ezeket. Ezek a plusz és mínusz szimbólumokat használhatják a nagyobb vagy kisebb értékek megadására, ahogyan a méret esetében is tettük.

A paraméter értéke megadja, hogy hány nappal ezelőttre szeretnénk keresni.

Ha olyan fájlokat keresünk, amelyek módosítási ideje egy nappal ezelőtt volt, írjuk be:

  • find / -mtime 1

Ha olyan fájlokat szeretnénk, amelyekhez egy napnál nem régebben nyúltak hozzá, beírhatjuk:

  • find / -atime -1

Ha olyan fájlokat keresünk, amelyek meta információit legutóbb több mint 3 nappal ezelőtt módosították, írjuk be:

  • find / -ctime +3

Létezik néhány kísérő paraméter is, amelyekkel napok helyett perceket adhatunk meg:

  • find / -mmin -1

Ez azokat a fájlokat fogja megadni, amelyeket az elmúlt percben módosítottak, írja be a rendszerbe.

A keresés egy referenciafájllal is végezhet összehasonlítást, és azokat adja vissza, amelyek újabbak:

  • find / -newer myfile

Tulajdonos és jogosultságok szerinti keresés

A fájlokat a fájl tulajdonosa vagy a csoport tulajdonosa alapján is kereshetjük.

Ezt a -user, illetve a -group paraméterekkel tehetjük meg. A “syslog” felhasználó tulajdonában lévő fájlt a:

  • find / -user syslog

beírásával kereshetjük meg:

  • find / -user syslog

Hasonlóképpen, az “shadow” csoport tulajdonában lévő fájlokat is megadhatjuk a:

  • find / -group shadow

Egyedi jogosultságokkal rendelkező fájlokat is kereshetünk.

Ha a jogosultságok pontos halmazát akarjuk megtalálni, akkor ezt a formát használjuk:

  • find / -perm 644

Ez pontosan a megadott jogosultságokkal rendelkező fájlokat fogja megtalálni.

Ha bármit szeretnénk megadni, aminek legalább ezek a jogosultságai vannak, akkor ezt a formát használhatjuk:

  • find / -perm -644

Ez minden olyan fájlt megtalál, amely további jogosultságokkal rendelkezik. Ebben az esetben egy “744” jogosultságú fájlra találna.

Szűrés mélység szerint

Ebben a szakaszban egy ideiglenes könyvtárban fogunk létrehozni egy könyvtárstruktúrát. Ez három szintű könyvtárat fog tartalmazni, az első szinten tíz könyvtárral. Minden könyvtár (beleértve az ideiglenes könyvtárat is) tíz fájlt és tíz alkönyvtárat fog tartalmazni.

Ezt a struktúrát a következő parancsokkal hozzuk létre:

  • 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

Nézzük meg bátran a ls és cd könyvtárstruktúrákat, hogy képet kapjunk a szervezésről. Ha végzett, térjen vissza a tesztkönyvtárba:

  • cd ~/test

Majd kidolgozzuk, hogyan adhatunk vissza konkrét fájlokat ebből a struktúrából. Az összehasonlítás kedvéért próbáljunk ki először egy példát egy egyszerű névkereséssel:

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

Egy csomó találatot kapunk. Ha a kimenetet átvezetjük egy számlálóba, láthatjuk, hogy összesen 1111 találat van:

  • find -name file1 | wc -l
Output
1111

Ez valószínűleg túl sok találat ahhoz, hogy a legtöbb esetben hasznos legyen. Próbáljuk meg leszűkíteni:

Megadhatjuk a keresés maximális mélységét a legfelső szintű keresési könyvtár alatt:

  • find -maxdepth num -name query

Ha csak a “file1”-et szeretnénk megtalálni a “level1” könyvtárakban és felette, megadhatjuk a maximális mélységet 2-ben (1 a legfelső szintű könyvtárra és 1 a level1 könyvtárakra):

  • 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

Ez már egy sokkal jobban kezelhető lista.

Egy minimális könyvtárat is megadhatunk, ha tudjuk, hogy az összes fájl egy bizonyos ponton túl létezik az aktuális könyvtár alatt:

  • find -mindepth num -name query

Ezzel csak a könyvtárágak végén lévő fájlokat kereshetjük meg:

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

Az elágazó könyvtárszerkezetünk miatt ez is nagyszámú (1000) eredményt fog visszaadni.

A min és max mélység paramétereket kombinálhatjuk, hogy egy szűk tartományra fókuszáljunk:

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

Keresési parancsok végrehajtása és kombinálása

A -exec paraméter használatával tetszőleges segédparancsot hajthatunk végre mindenre, amire a find találatot ad. Ezt így hívjuk:

  • find find_parameters -exec command_and_params {} \;

A {} a találatokat tartalmazó fájlok helyőrzőjeként szolgál. A \; arra szolgál, hogy a find tudja, hol ér véget a parancs.

Megkereshetjük például az előző szakaszban szereplő, 644 jogosultságú fájlokat, és módosíthatjuk őket 664 jogosultságúvá:

  • cd ~/test
  • find . -type f -perm 644 -exec chmod 664 {} \;

A könyvtárak jogosultságait így módosíthatjuk:

  • find . -type d -perm 755 -exec chmod 700 {} \;

Ha különböző eredményeket szeretnénk láncolni, használhatjuk a -and vagy -or parancsokat. A -and elhagyása esetén a -and feltételezett.

  • find . -name file1 -or -name file9

Fájlok keresése a Locate használatával

A find használatának alternatívája a locate parancs. Ez a parancs gyakran gyorsabb, és a teljes fájlrendszerben könnyedén tud keresni.

A parancsot Debian vagy Ubuntu rendszereken a apt segítségével telepítheted:

  • sudo apt install mlocate

CentOS rendszereken használd helyette a dnf parancsot:

  • sudo dnf install mlocate

Azért gyorsabb a locate, mint a find, mert a fájlrendszerben lévő fájlok adatbázisára támaszkodik.

Az adatbázis általában naponta egyszer frissül egy cron szkript segítségével, de manuálisan is frissítheted, ha beírod:

  • sudo updatedb

Futtasd most ezt a parancsot. Ne feledje, az adatbázisnak mindig naprakésznek kell lennie, ha nemrég szerzett vagy létrehozott fájlokat akar találni.

A fájlok kereséséhez a locate parancs segítségével egyszerűen használja ezt a szintaxist:

  • locate query

A kimenetet néhány módon szűrheti.

Hogy például csak magát a lekérdezést tartalmazó fájlokat adjon vissza, ahelyett, hogy minden olyan fájlt visszaadna, amely a lekérdezést tartalmazza a hozzá vezető könyvtárakban, használhatja a -b-t, hogy csak az “alapnevet” keresse:

  • locate -b query

Hogy a locate csak olyan eredményeket adjon vissza, amelyek még léteznek a fájlrendszerben (amelyek nem lettek eltávolítva az utolsó updatedb hívás és az aktuális locate hívás között), használja a -e flag-et:

  • locate -e query

A locate által katalogizált információk statisztikáinak megtekintéséhez használja a -S opciót:

  • 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

Következtetés

A find és a locate is jó módszer a rendszerben lévő fájlok keresésére. Az Ön feladata eldönteni, hogy az egyes helyzetekben melyik eszköz a megfelelő.

A find és a locate erős parancsok, amelyeket erősíthetünk, ha más segédprogramokkal kombináljuk őket csővezetékeken keresztül. Kísérletezzen a szűréssel az olyan parancsok használatával, mint a wc, sort és grep.

Similar Posts

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.