Ukaz find: iskanje datotek v Linuxu s primeri

Linux Branje: 10 min

find je najpomembnejši ukaz za iskanje v Linuxu: prehodi mapo in vse njene podmape (rekurzivno) ter izpiše datoteke, ki ustrezajo navedenim pogojem, po imenu, velikosti, času spremembe, lastniku ali dovoljenjih. Z najdenimi datotekami lahko takoj izvedeš tudi operacijo: jih izbrišeš, jim spremeniš dovoljenja ali iščeš po njih.

Primere smo novembra 2026 zagnali v sistemu AlmaLinux 10.2, z ukazom find iz GNU findutils 4.10, na vzorčnem imeniku (/var/www/pelda.hu, spletno mesto, podobno WordPressu, z varnostnimi kopijami, dnevniki in predpomnilnikom); Ubuntu 26.04 uporablja isto različico. Ukazi delujejo tudi na KVM VPS in v vmesniku Terminal gostovanja cPanel, tam v tvojem domačem imeniku.

Osnovna oblika

find KJE POGOJI DEJANJE
find /var/www -name 'wp-config.php'
find . -type f -name '*.log'
  • KJE: mapa, kjer se iskanje začne (. je trenutni imenik). Če ga izpustiš, find išče v trenutnem imeniku.
  • POGOJI: na primer -name, -type, -size. Med več pogoji je privzeto povezava IN.
  • DEJANJE: če je ne navedeš, find izpiše najdene poti (-print).

Iskanje po imenu

find . -name 'index.php'       # natančno ime
find . -name '*.php'           # vse datoteke .php
find . -iname 'readme.txt'     # ne glede na velike in male črke

-iname je v preizkusu našel datoteki README.TXT in readme.txt, -name pa le natančno ujemanje.

Nadomestne znake (*, ?) vedno postavi med narekovaje. Brez narekovajev jih lupina še pred zagonom find nadomesti z imeni datotek v trenutnem imeniku. Če je tam ena datoteka .php, find išče le to ime; če jih je več, se ustavi z napako:

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

-name preverja le ime datoteke, ne poti map. Del poti išče -path: find . -path '*/uploads/*.php' vrne datoteke PHP, ki so pristale v mapah za nalaganje, kar je na vdrti strani WordPress pogost znak.

Več imen iščeš s stikalom -o (ALI), med oklepaji:

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

Po vrsti: -type

find . -type f -name '*.html'   # le datoteke
find . -type d -name cache      # le mape
find . -type l                  # szimbolikus linkek
find . -xtype l                 # pokvarjene simbolne povezave

O povezavah in ravnanju s prekinjenimi povezavami govori članek o brisanju in preimenovanju datotek ter povezavah.

Prazne datoteke in mape:

find . -empty
find . -type d -empty

Po velikosti: -size

find . -type f -size +100M     # večje od 100 MB
find . -type f -size -10k      # manjše od 10 kB
find . -type f -size +1G       # večje od 1 GB

Enote: c (bajt), k (KiB), M (MiB), G (GiB). + pomeni večje, - manjše, brez predznaka pa natančno ujemanje.

Past pri majhnih vrednostih: find velikost zaokroži navzgor na navedeno enoto. -size -1k zato vrne le datoteke z 0 bajti: v preizkusu je 30-bajtna datoteka PHP štela kot velikost „1k” in izpadla. Za natančno mejo jo navedi v bajtih: -size -1024c. Podobno zaokroževanje pri meji gigabajtov prikazuje članek o iskanju datotek error_log.

Iskanje največjih datotek

Seznam velikih datotek z velikostmi v berljivi obliki:

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

Pet največjih datotek, razvrščenih po velikosti:

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

-printf izpiše velikost (%s, v bajtih) in pot (%p), sort -nr jih razvrsti padajoče, numfmt --to=iec pa jih pretvori v berljivo enoto (350M).

Ukaz find izpiše datoteke, večje od 100 MB, pet največjih datotek in datoteke, spremenjene pred več kot 30 dnevi

Če te ne zanimajo datoteke, temveč velikost map, je boljše orodje du: glej primere ukaza du.

Po času: -mtime, -mmin, -newer

find . -type f -mtime +30      # spremenjene pred več kot 30 dnevi
find . -type f -mtime -7       # spremenjene v zadnjih 7 dneh
find . -type f -mmin -60       # spremenjene v zadnjih 60 minutah

-mtime šteje v 24-urnih enotah in zaokroža navzdol: -mtime 1 pomeni datoteke, spremenjene pred 24–48 urami, -mtime +30 pa tiste, spremenjene pred vsaj 31 dnevi. S stikalom -daystart dneve šteje od polnoči (find . -daystart -mtime 0 vrne danes spremenjene).

Novejše od datoteke ali datuma:

find . -newer referencia.txt
find . -type f -newermt '2026-11-01'
find . -type f ! -newermt '2026-11-01'    # starejše od tega

Poleg -mtime obstajata tudi -atime (zadnje branje) in -ctime (zadnja sprememba stanja, na primer sprememba dovoljenj). -atime ni zanesljiv: v obeh sistemih preizkusa je bil korenski datotečni sistem priklopljen z nastavitvijo relatime, ki čas branja posodablja le redko.

Pri vdrti strani je uporaben seznam datotek PHP, spremenjenih v zadnjih dneh:

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

Po lastniku in dovoljenjih

find . -user root              # datoteke v lasti root
find . ! -user www-data        # niso v lasti www-data
find . -group users
find . -nouser                 # datoteke izbrisanega uporabnika

Po dovoljenjih:

find . -perm 777               # pontosan 777
find . -type f -perm -o+w      # datoteke, v katere lahko piše vsakdo
find . -type d -perm -0002     # mape, v katere lahko piše vsakdo

-perm 644 brez predznaka vrne datoteke z natanko 644, -perm -644 pa tiste, ki imajo vsaj te pravice.

Najpogostejša uporaba je urejanje dovoljenj, na primer na spletnem mestu mape dobijo pravice 755, datoteke pa 644:

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

Pomen dovoljenj pojasnjuje članek o ukazih chmod in chown.

Globina: -maxdepth, -mindepth

find . -maxdepth 1             # le trenutna mapa, brez podmap
find . -maxdepth 2 -name '*.log'
find . -mindepth 2 -maxdepth 2 -type d

-maxdepth in -mindepth veljata za celotno iskanje, ne glede na to, kje v vrstici stojita; zaradi berljivosti ju običajno pišemo na začetek pogojev.

Izključitev map: -prune in -not -path

Mapo (na primer predpomnilnik ali varnostne kopije) lahko izključiš na dva načina:

# -prune: find v mapo sploh ne vstopi
find . -path ./public_html/wp-content/cache -prune -o -type f -name '*.html' -print

# -not -path: vstopi, vendar zadetke izloči
find . -type f -name '*.html' -not -path '*/cache/*'

-prune je hitrejši, ker izključene mape sploh ne prehodi; pri velikem predpomnilniku ali mapi node_modules je to zelo pomembno. -print na koncu je obvezen: brez njega find izpiše tudi ime izključene mape (v preizkusu se je pojavila tudi vrstica ./public_html/wp-content/cache).

Po -prune naj se vrednost -path začne enako kot mesto iskanja (pri . z ./). Več map lahko izključiš med oklepaji:

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

Po imenu, kjer koli v drevesu: find . -name cache -prune -o -name '*.html' -print.

Operacije z najdenimi datotekami

-exec: zagon ukaza

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

Na mesto {} pridejo najdene datoteke. Razlika med zaključkoma:

  • {} +: datoteke preda skupinsko, enemu (ali nekaj) klicem ukaza: grep ... fajl1 fajl2 fajl3. Pri veliko datotekah je to veliko hitrejše.
  • {} \;: ukaz zažene za vsako datoteko posebej. Potrebno je, če ukaz naenkrat sprejme le eno datoteko ali če {} ni na koncu vrstice (na primer -exec cp {} {}.bak \;, ki od vsake datoteke naredi kopijo s končnico .bak).

-ok deluje enako kot -exec ... \;, vendar pred vsako datoteko vpraša (< rm ... ./logs/access.log > ?).

Iskanje po vsebini datotek: find in grep

find izbere datoteke, grep pa išče po njihovi vsebini. V preizkusu smo tako našli sumljivo datoteko PHP, ki smo jo dali v vzorčni imenik:

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

-l izpiše le imena datotek. Če drugih pogojev find ne potrebuješ, zna tudi grep sam iskati rekurzivno, s filtriranjem po končnici: grep -rl --include='*.php' base64_decode .. find je boljši, če je treba filtrirati tudi po velikosti, datumu ali lastniku, na primer če iščeš le po datotekah PHP, spremenjenih v zadnjih treh dneh. O drugih možnostih grep (na primer o vrsticah pred zadetkom in za njim) govori ločen članek, o iskanju zlonamerne programske opreme pa članek o ClamAV in Maldet.

xargs in -print0

Izpis find lahko predaš tudi ukazu xargs, vendar pri imenih datotek s presledki to pravilno deluje le s parom -print0 in -0:

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

Brez -print0 xargs ime pri presledku razreže na dvoje:

$ 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

V večini primerov je -exec ... {} + preprostejši in enako hiter.

Brisanje: -delete

# 1. Najprej le izpiši, kaj bi izbrisal
find . -type f -name '*.html' -mtime +30 -print

# 2. Če je seznam pravi, izbriši
find . -type f -name '*.html' -mtime +30 -delete

Vrstni red pogojev je pomemben. find vrednoti od leve proti desni, tudi -delete pa je pogoj, ki velja za vse. V preizkusu find ~/cc -delete -name 'c3.html' ni izbrisal datoteke c3.html, temveč celotno mapo ~/cc, ker se je -delete izvedel na vsakem elementu pred preverjanjem imena. -delete naj bo vedno na koncu vrstice.

-delete in -prune ni mogoče uporabiti skupaj: -delete vklopi način -depth, v katerem je -prune neučinkovit, find pa se je v preizkusu ustavil z opozorilom in ni izbrisal ničesar. Takrat uporabi obliko -not -path.

Brisanje praznih map (na primer po čiščenju predpomnilnika): find . -type d -empty -delete. Brisanje je dokončno, Linux nima koša.

Redno čiščenje s cronom

Brisanje starih varnostnih kopij ali datotek predpomnilnika je mogoče dobro načrtovati. Ta vrstica vsako noč ob 3:30 izbriše varnostne kopije, starejše od 14 dni:

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

Uporabo crona opisuje članek o sintaksi crontab.

Iskanje po celotnem sistemu

sudo find / -xdev -type f -size +100M 2>/dev/null
  • -xdev: ne prestopi na druge datotečne sisteme, zato izpadejo /proc, /sys in priklopljeni diski. Brez -xdev je find / v preizkusu tudi navidezno datoteko /proc/kcore prikazal kot večjo od 100 MB in izpisal napake za vnose v /proc, ki so med izvajanjem izginjali.
  • 2>/dev/null: utiša sporočila o napakah. Kot navaden uporabnik find / izpiše veliko vrstic Permission denied (find: '/boot/grub2': Permission denied), med katerimi je težko opaziti zadetek.

Simbolnim povezavam find privzeto ne sledi; s stikalom -L išče tudi v povezanih mapah (v preizkusu so se velike datoteke mape z varnostnimi kopijami, povezane pod public_html, pojavile le ob -L).

Hitro iskanje po imenu: locate in plocate

locate ne prehodi diska, temveč išče v vnaprej pripravljeni podatkovni bazi, zato je zelo hiter. Na cloud image AlmaLinux 10 in Ubuntu 26.04 ni bil nameščen; v današnjih distribucijah ga ponuja paket plocate:

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

sudo updatedb                 # posodobitev podatkovne baze
locate wp-config.php
locate -i readme.txt

Podatkovno bazo vsak dan posodobi časovnik (v AlmaLinuxu plocate-updatedb.timer), zato locate ne najde datotek, ustvarjenih po zadnji posodobitvi: v preizkusu za ravnokar ustvarjeno datoteko ni dal zadetka. Po velikosti, datumu ali dovoljenjih ne zna filtrirati; za to je potreben find.

Povzetek

Naloga Ukaz
Po imenu find . -name '*.php'
Neodvisno od velikih in malih črk find . -iname 'readme*'
Le mape find . -type d -name cache
Datoteke, večje od 100 MB find . -type f -size +100M
Pet največjih datotek find . -type f -printf '%s %p\n' | sort -nr | head -5
Datoteke, starejše od 30 dni find . -type f -mtime +30
Spremenjene v zadnji uri find . -mmin -60
Datoteke, v katere lahko piše vsak find . -type f -perm -o+w
Izključitev mape find . -path ./cache -prune -o -name '*.html' -print
Iskanje besedila v datotekah find . -name '*.php' -exec grep -l 'besedilo' {} +
Brisanje (na koncu!) find . -name '*.tmp' -mtime +7 -delete
Celoten sistem, brez napak sudo find / -xdev -name 'x' 2>/dev/null
Nazaj: Linux – članki (76)