A find parancs: fájlok keresése Linuxon példákkal

Linux 10 perc olvasás

A find a Linux legfontosabb keresőparancsa: egy mappát és az összes almappáját (rekurzívan) végigjárja, és kilistázza azokat a fájlokat, amelyek megfelelnek a megadott feltételeknek, név, méret, módosítási idő, tulajdonos vagy jogosultság szerint. A talált fájlokkal rögtön műveletet is végezhetsz: törölheted, átjogosíthatod, vagy kereshetsz bennük.

A példákat 2026 novemberében AlmaLinux 10.2 rendszeren, a GNU findutils 4.10-es find parancsával futtattuk egy mintakönyvtáron (/var/www/pelda.hu, egy WordPress-szerű webhely mentésekkel, naplókkal és gyorsítótárral); az Ubuntu 26.04 ugyanezt a verziót használja. A parancsok egy KVM VPS-en és a cPanel tárhely Terminal felületén is működnek, ott a saját home könyvtáradban.

Az alapforma

find HOL FELTÉTELEK MŰVELET
find /var/www -name 'wp-config.php'
find . -type f -name '*.log'
  • HOL: a mappa, ahol a keresés indul (a . az aktuális könyvtár). Ha elhagyod, a find az aktuális könyvtárban keres.
  • FELTÉTELEK: például -name, -type, -size. Több feltétel között alapból ÉS kapcsolat van.
  • MŰVELET: ha nem adsz meg, a find kiírja a talált útvonalakat (-print).

Keresés név szerint

find . -name 'index.php'       # pontos név
find . -name '*.php'           # minden .php fájl
find . -iname 'readme.txt'     # kis- és nagybetűtől függetlenül

A -iname a teszten a README.TXT és a readme.txt fájlt is megtalálta, a -name csak a pontos egyezést.

A helyettesítő karaktereket (*, ?) mindig tedd idézőjelbe. Idézőjel nélkül a shell még a find indulása előtt behelyettesíti őket az aktuális könyvtár fájlneveivel. Ha ott egy .php fájl van, a find csak azt a nevet keresi; ha több, hibával leáll:

$ find . -name *.php
find: paths must precede expression: `index.php'
find: possible unquoted pattern after predicate `-name'?

A -name csak a fájl nevét vizsgálja, a mappák útvonalát nem. Útvonalrészre a -path keres: find . -path '*/uploads/*.php' a feltöltési mappákba került PHP-fájlokat adja, ami egy feltört WordPress-oldalon gyakori jel.

Több névre a -o (VAGY) kapcsolóval kereshetsz, zárójelek között:

find . \( -name '*.jpg' -o -name '*.JPG' -o -name '*.png' \)

Típus szerint: -type

find . -type f -name '*.html'   # csak fájlok
find . -type d -name cache      # csak mappák
find . -type l                  # szimbolikus linkek
find . -xtype l                 # törött szimbolikus linkek

A linkekről és a törött linkek kezeléséről a fájlok törléséről, átnevezéséről és a linkekről szóló cikk szól.

Üres fájlok és mappák:

find . -empty
find . -type d -empty

Méret szerint: -size

find . -type f -size +100M     # 100 MB-nál nagyobb
find . -type f -size -10k      # 10 kB-nál kisebb
find . -type f -size +1G       # 1 GB-nál nagyobb

Mértékegységek: c (bájt), k (KiB), M (MiB), G (GiB). A + nagyobbat, a - kisebbet jelent, előjel nélkül pontos egyezést.

Csapda a kis értékeknél: a find a méretet felfelé kerekíti a megadott egységre. A -size -1k ezért csak a 0 bájtos fájlokat adja: a teszten egy 30 bájtos PHP-fájl „1k” méretűnek számított, és kimaradt. Pontos határhoz add meg bájtban: -size -1024c. A gigabájtos határ hasonló kerekítését az error_log fájlok kereséséről szóló cikk mutatja be.

A legnagyobb fájlok megkeresése

A nagy fájlok listája méretekkel, olvasható formában:

find . -type f -size +100M -exec ls -lh {} +

Az öt legnagyobb fájl, méret szerint rendezve:

find . -type f -printf '%s %p\n' | sort -nr | head -5 | numfmt --to=iec

A -printf a méretet (%s, bájtban) és az útvonalat (%p) írja ki, a sort -nr csökkenő sorrendbe rendezi, a numfmt --to=iec pedig olvasható mértékegységre váltja (350M).

A find parancs a 100 MB-nál nagyobb fájlokat, az öt legnagyobb fájlt és a 30 napnál régebben módosított fájlokat listázza

Ha nem a fájlok, hanem a mappák mérete érdekel, a du a jobb eszköz: lásd a du parancs példáit.

Idő szerint: -mtime, -mmin, -newer

find . -type f -mtime +30      # 30 napnál régebben módosított
find . -type f -mtime -7       # az elmúlt 7 napban módosított
find . -type f -mmin -60       # az elmúlt 60 percben módosított

A -mtime 24 órás egységekben számol, és lefelé kerekít: a -mtime 1 a 24–48 órával ezelőtt módosított fájlokat jelenti, a -mtime +30 pedig a legalább 31 napja módosítottakat. A -daystart kapcsolóval a napokat éjféltől számolja (find . -daystart -mtime 0 a ma módosítottakat adja).

Egy fájlnál vagy egy dátumnál újabbak:

find . -newer referencia.txt
find . -type f -newermt '2026-11-01'
find . -type f ! -newermt '2026-11-01'    # ennél régebbiek

A -mtime mellett van -atime (utolsó olvasás) és -ctime (utolsó állapotváltozás, például jogosultság-módosítás) is. Az -atime nem megbízható: a teszt mindkét rendszerén relatime beállítással volt csatolva a gyökér fájlrendszer, amely az olvasási időt csak ritkán frissíti.

Egy feltört webhelynél hasznos az elmúlt napokban módosított PHP-fájlok listája:

find /var/www -type f -name '*.php' -mtime -3

Tulajdonos és jogosultság szerint

find . -user root              # a root tulajdonában lévő fájlok
find . ! -user www-data        # nem a www-data tulajdonában
find . -group users
find . -nouser                 # törölt felhasználó fájljai

Jogosultság szerint:

find . -perm 777               # pontosan 777
find . -type f -perm -o+w      # mindenki által írható fájlok
find . -type d -perm -0002     # mindenki által írható mappák

Az előjel nélküli -perm 644 a pontosan 644-es fájlokat adja, a -perm -644 azokat, amelyeken legalább ezek a jogok megvannak.

A leggyakoribb használat a jogosultságok rendbetétele, például egy webhelyen a mappák 755, a fájlok 644 jogot kapnak:

find public_html -type d -exec chmod 755 {} +
find public_html -type f -exec chmod 644 {} +

A jogosultságok jelentését a chmod és chown parancsot bemutató cikk magyarázza el.

Mélység: -maxdepth, -mindepth

find . -maxdepth 1             # csak az aktuális mappa, almappák nélkül
find . -maxdepth 2 -name '*.log'
find . -mindepth 2 -maxdepth 2 -type d

A -maxdepth és a -mindepth a keresés egészére vonatkozik, bárhol áll a sorban; az olvashatóság kedvéért a feltételek elejére szokás írni.

Mappák kizárása: -prune és -not -path

Egy mappa (például a gyorsítótár vagy a mentések) kizárásának két módja van:

# -prune: a find be sem lép a mappába
find . -path ./public_html/wp-content/cache -prune -o -type f -name '*.html' -print

# -not -path: belép, de kiszűri a találatokat
find . -type f -name '*.html' -not -path '*/cache/*'

A -prune gyorsabb, mert a kizárt mappát egyáltalán nem járja be; nagy gyorsítótárnál vagy egy node_modules mappánál ez sokat számít. A -print a végén kötelező: nélküle a find a kizárt mappa nevét is kiírja (a teszten a ./public_html/wp-content/cache sor is megjelent).

A -prune után a -path értéke ugyanúgy kezdődjön, mint a keresési hely (. esetén ./). Több mappát zárójelek között zárhatsz ki:

find . \( -path ./backup -o -path ./public_html/wp-content/cache \) -prune -o -type f -size +10M -print

Név szerint, bárhol a fában: find . -name cache -prune -o -name '*.html' -print.

Műveletek a talált fájlokkal

-exec: parancs futtatása

find . -name '*.php' -exec grep -l 'base64_decode' {} +
find . -name '*.log' -exec ls -lh {} \;

A {} helyére kerülnek a talált fájlok. A két lezárás különbsége:

  • {} +: a fájlokat csoportosan, egy (vagy kevés) parancshívásnak adja át: grep ... fajl1 fajl2 fajl3. Sok fájlnál ez sokkal gyorsabb.
  • {} \;: minden fájlra külön elindítja a parancsot. Akkor kell, ha a parancs egyszerre csak egy fájlt fogad el, vagy a {} nem a sor végén áll (például -exec cp {} {}.bak \;, amely minden fájlról .bak végű másolatot készít).

Az -ok ugyanúgy működik, mint az -exec ... \;, de minden fájl előtt rákérdez (< rm ... ./logs/access.log > ?).

Keresés a fájlok tartalmában: find és grep

A find a fájlokat válogatja ki, a grep a tartalmukban keres. A teszten így találtuk meg a mintakönyvtárba tett gyanús PHP-fájlt:

find . -name '*.php' -exec grep -l 'base64_decode' {} +

A -l csak a fájlneveket írja ki. Ha nincs szükség a find többi feltételére, a grep maga is tud rekurzívan, kiterjesztés szerint szűrve keresni: grep -rl --include='*.php' base64_decode .. A find akkor jobb, ha méret, dátum vagy tulajdonos szerint is szűrni kell, például csak az elmúlt három napban módosított PHP-fájlokban keresel. A grep további lehetőségeiről (például a találat előtti és utáni sorokról) külön cikk szól, a kártevők kereséséről pedig a ClamAV-ról és a Maldetről szóló cikk.

xargs és a -print0

A find kimenete az xargs paranccsal is továbbadható, de a szóközt tartalmazó fájlneveknél ez csak a -print0 és -0 párossal működik helyesen:

find . -name '*.log' -print0 | xargs -0 ls -l

A -print0 nélkül az xargs a szóköznél kettévágja a nevet:

$ find . -name '*.log' | xargs ls -l
ls: cannot access './public_html/szep': No such file or directory
ls: cannot access 'fajl.log': No such file or directory

A legtöbb esetben az -exec ... {} + egyszerűbb, és ugyanolyan gyors.

Törlés: -delete

# 1. Először csak listázd ki, mit törölne
find . -type f -name '*.html' -mtime +30 -print

# 2. Ha a lista jó, töröld
find . -type f -name '*.html' -mtime +30 -delete

A feltételek sorrendje számít. A find balról jobbra értékel, és a -delete is egy feltétel, amely mindenre igaz. A teszten a find ~/cc -delete -name 'c3.html' nem a c3.html fájlt törölte, hanem a teljes ~/cc mappát, mert a -delete a név vizsgálata előtt minden elemre lefutott. A -delete mindig a sor végére kerüljön.

A -delete és a -prune nem használható együtt: a -delete bekapcsolja a -depth módot, amelyben a -prune hatástalan, és a find a teszten figyelmeztetéssel leállt, semmit sem törölt. Ilyenkor a -not -path formát használd.

Üres mappák törlése (például egy gyorsítótár takarítása után): find . -type d -empty -delete. A törlés végleges, Linuxon nincs lomtár.

Rendszeres takarítás cronnal

A régi mentések vagy gyorsítótár-fájlok törlése jól ütemezhető. Ez a sor minden éjjel 3:30-kor törli a 14 napnál régebbi mentéseket:

30 3 * * * find /var/backups/pelda -type f -name '*.tar.gz' -mtime +14 -delete

A cron használatát a crontab szintaxisát bemutató cikk írja le.

Keresés az egész rendszerben

sudo find / -xdev -type f -size +100M 2>/dev/null
  • -xdev: nem lép át más fájlrendszerekre, így kimaradnak a /proc, /sys és a csatolt lemezek. A -xdev nélkül a find / a teszten a /proc/kcore virtuális fájlt is 100 MB-nál nagyobbnak mutatta, és hibákat írt a futás közben eltűnő /proc bejegyzésekre.
  • 2>/dev/null: elnyomja a hibaüzeneteket. Sima felhasználóként a find / sok Permission denied sort ír ki (find: '/boot/grub2': Permission denied), amelyek között nehéz észrevenni a találatot.

Szimbolikus linkeket a find alapból nem követ; a -L kapcsolóval a linkelt mappákban is keres (a teszten a public_html alá linkelt mentési mappa nagy fájljai csak -L mellett jelentek meg).

Gyors névkeresés: locate és plocate

A locate nem járja be a lemezt, hanem egy előre elkészített adatbázisban keres, ezért nagyon gyors. Az AlmaLinux 10 és az Ubuntu 26.04 cloud image-én nem volt telepítve; a mai disztribúciókon a plocate csomag adja:

sudo dnf install plocate      # AlmaLinux, Rocky Linux
sudo apt install plocate      # Ubuntu, Debian

sudo updatedb                 # adatbázis frissítése
locate wp-config.php
locate -i readme.txt

Az adatbázist egy időzítő naponta frissíti (AlmaLinuxon a plocate-updatedb.timer), ezért a locate a legutóbbi frissítés óta létrehozott fájlokat nem találja: a teszten egy éppen létrehozott fájlra nem adott találatot. Méret, dátum vagy jogosultság szerint nem tud szűrni; ezekhez a find kell.

Összefoglalás

Feladat Parancs
Név szerint find . -name '*.php'
Kis- és nagybetűtől függetlenül find . -iname 'readme*'
Csak mappák find . -type d -name cache
100 MB-nál nagyobb fájlok find . -type f -size +100M
Az öt legnagyobb fájl find . -type f -printf '%s %p\n' | sort -nr | head -5
30 napnál régebbi fájlok find . -type f -mtime +30
Az elmúlt órában módosítottak find . -mmin -60
Mindenki által írható fájlok find . -type f -perm -o+w
Mappa kizárása find . -path ./cache -prune -o -name '*.html' -print
Szöveg keresése a fájlokban find . -name '*.php' -exec grep -l 'szöveg' {} +
Törlés (a végén!) find . -name '*.tmp' -mtime +7 -delete
Egész rendszer, hibák nélkül sudo find / -xdev -name 'x' 2>/dev/null
Vissza: Linux leírások (76)