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š,findišče v trenutnem imeniku.POGOJI: na primer-name,-type,-size. Med več pogoji je privzeto povezava IN.DEJANJE: če je ne navedeš,findizpiš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).
Č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,/sysin priklopljeni diski. Brez-xdevjefind /v preizkusu tudi navidezno datoteko/proc/kcoreprikazal 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 uporabnikfind /izpiše veliko vrsticPermission 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 |
