Pretraga fajlova: find
Cilj lekcije: Nauciti kako koristiti find za pronalazenje fajlova i direktorijuma prema raznim kriterijumima, i kako izvrsavati komande nad pronadjenim rezultatima.
Sta je find?
Dok grep pretrazuje sadrzaj fajlova, find pretrazuje samo sistem fajlova — trazi same fajlove i direktorijume prema zadatim kriterijumima kao sto su ime, tip, velicina, vreme izmene, dozvole i slicno.
Osnovna sintaksa:
find [PUTANJA] [KRITERIJUMI] [AKCIJA]
Najjednostavniji primer — pronadji sve fajlove u trenutnom direktorijumu i poddirektorijumima:
find .
Pronadji u /home/student:
find /home/student
Pretraga po imenu
-name : Tacno ime ili obrazac (osetljivo na mala/velika slova)
find /home/student -name "notes.txt"
# pronalazi tacno taj fajl
find /home/student -name "*.txt"
# pronalazi sve .txt fajlove
find /etc -name "*.conf"
# svi konfiguracioni fajlovi u /etc
Vazno: Obrazac sa
*mora biti pod navodnicima da ga shell ne bi interpretirao pre nego sto ga prosledi komandifind.
-iname : Isto, ali ignorise velika/mala slova
find /home/student -iname "readme*"
# pronalazi: README.md, readme.txt, Readme.rst...
Pretraga po tipu
-type : Tip fajla
| Vrednost | Znacenje |
|---|---|
f |
Obican fajl (file) |
d |
Direktorijum (directory) |
l |
Simbolicki link |
p |
Named pipe |
s |
Socket |
find /home/student -type f # samo fajlovi
find /home/student -type d # samo direktorijumi
find /var/log -type f -name "*.log" # samo .log fajlovi (ne direktorijumi)
Pretraga po velicini
-size : Velicina fajla
Prefiksi: + (vece od), - (manje od), bez prefiksa (tacno)
Jedinice: c (bajti), k (kilobajti), M (megabajti), G (gigabajti)
find /var/log -size +1M # fajlovi veci od 1 megabajta
find /home/student -size +10M # fajlovi veci od 10 MB
find /tmp -size -100k # fajlovi manji od 100 KB
find / -size +1G # fajlovi veci od 1 GB (oprez!)
Kombinovanje:
find /var -type f -size +1M -name "*.log"
# .log fajlovi veci od 1 MB
Pretraga po vremenu
Linux prati tri vremenske oznake za svaki fajl:
- mtime (modification time) — kada je sadrzaj fajla poslednji put izmenjen
- atime (access time) — kada je fajl poslednji put citavan
- ctime (change time) — kada su metapodaci (dozvole, vlasnik) poslednji put izmenjeni
-mtime : Po vremenu izmene (u danima)
find /home/student -mtime -7 # izmenjeni u poslednjih 7 dana
find /var/log -mtime +30 # nisu menjani 30+ dana
find /tmp -mtime +1 # stariji od 1 dana
-mmin : Po vremenu izmene (u minutima)
find /home/student -mmin -60 # izmenjeni u poslednjih 60 minuta
find /tmp -mmin +120 # nisu menjani 2+ sata
-newer : Noviji od odredjenog fajla
find /home/student -newer referentni_fajl.txt
# pronalazi sve sto je izmenjeno POSLE referentni_fajl.txt
Kombinovanje kriterijuma
find podrazumevano kombinuje kriterijume sa logickim I (AND):
find /var/log -type f -name "*.log" -size +1M
# fajlovi (ne direktorijumi) + .log ekstenzija + veci od 1 MB
-o : Logicko ILI
find /home/student -name "*.txt" -o -name "*.md"
# .txt ILI .md fajlovi
! ili -not : Negacija
find /home/student -type f -not -name "*.txt"
# svi fajlovi koji NISU .txt
Akcije nad rezultatima
-print : Ispisi putanje (podrazumevano)
find /home/student -name "*.txt" -print
# isto kao bez -print, ali eksplicitno
-delete : Obrisi pronadjene fajlove
find /tmp -mtime +7 -delete
# obrisi sve u /tmp starije od 7 dana
Upozorenje: Uvek prvo proveri sta
findpronalazi pre nego sto dodas-delete!
-exec : Izvrsi komandu nad svakim rezultatom
Ovo je najmocanija akcija. {} se zamenjuje putanjom pronadjenog fajla, a komanda se zavrsava sa \;:
find /home/student -name "*.txt" -exec cat {} \;
# ispisi sadrzaj svakih .txt fajla
find /home/student -name "*.bak" -exec rm {} \;
# obrisi sve .bak fajlove
find /var/log -name "*.log" -size +10M -exec gzip {} \;
# kompresuj sve .log fajlove vece od 10 MB
-exec sa + umesto ;
Razlika izmedju \; i +:
\;— pokrece komandu jednom po fajlu (svaki fajl = poseban poziv)+— skuplja sve fajlove i pokrece komandu jednom sa svima (efikasnije)
# Sa \; — tri poziva ako ima tri fajla:
# ls -la a.txt
# ls -la b.txt
# ls -la c.txt
find /home/student -name "*.txt" -exec ls -la {} \;
# Sa + — jedan poziv sa svim fajlovima:
# ls -la a.txt b.txt c.txt
find /home/student -name "*.txt" -exec ls -la {} +
Koristi + kada mozes — brze je. Koristi \; kada komanda mora da se poziva za svaki fajl posebno (npr. mv ili rename).
-ls : Ispisi kao ls -l
find /var/log -name "*.log" -ls
# detaljan ispis pronadjenih fajlova
Prakticni primeri
Pronadji sve .log fajlove
# U /var/log rekurzivno
find /var/log -type f -name "*.log"
# Samo u trenutnom direktorijumu (dubina 1)
find . -maxdepth 1 -name "*.log"
# Sortirano po velicini
find /var/log -type f -name "*.log" -exec ls -lh {} + | sort -k5 -h
Pronadji fajlove vece od 10 MB
find / -type f -size +10M 2>/dev/null
# 2>/dev/null skriva greske o nedostupnim direktorijumima
# Sortirano po velicini (od najveceg)
find / -type f -size +10M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh
Pronadji nedavno izmenjene fajlove
# Izmenjeni u poslednjih 24 sata
find /home/student -mtime -1 -type f
# Izmenjeni u poslednjih 10 minuta
find /home/student -mmin -10 -type f
Ciscenje privremenih fajlova
# Pregled sta bi bilo obrisano
find /tmp -mtime +3 -type f
# Brisanje (nakon provere)
find /tmp -mtime +3 -type f -delete
Pronadji fajlove sa odredjenim dozvolama
find /home -perm 777 -type f
# svi fajlovi sa dozvolama rwxrwxrwx (opasno!)
find /usr/bin -perm -4000
# suid fajlovi (mogu biti bezbednosni rizik)
Korisne kombinacije sa grep-om
find i grep se cesto kombinuju:
# Pronadji sve Python fajlove koji sadrze "import os"
find /home/student -name "*.py" -exec grep -l "import os" {} \;
# Pretrazi samo .conf fajlove u /etc
find /etc -name "*.conf" -exec grep -n "Port" {} \; 2>/dev/null
# Pronadji koji fajl sadrzi odredjeni tekst rekurzivno efikasno
grep -r "trazeni tekst" --include="*.txt" .
Ogranicavanje dubine pretrage
find /home/student -maxdepth 1 -type f
# samo fajlovi u /home/student (ne u poddirektorijumima)
find /home/student -maxdepth 2 -name "*.conf"
# do 2 nivoa dubine
find /home/student -mindepth 2 -type f
# preskoci prvi nivo, pocni od drugog
Rezime
| Kriterijum | Primer | Znacenje |
|---|---|---|
-name |
-name "*.txt" |
Ime fajla (sa glob obrascem) |
-iname |
-iname "readme*" |
Ime, ignorisi mala/velika |
-type f |
-type f |
Samo obicni fajlovi |
-type d |
-type d |
Samo direktorijumi |
-size +1M |
-size +10M |
Vece od X |
-size -100k |
-size -100k |
Manje od X |
-mtime -7 |
-mtime -7 |
Izmenjeni u poslednjih 7 dana |
-mmin -60 |
-mmin -60 |
Izmenjeni u poslednjih 60 minuta |
-newer |
-newer ref.txt |
Noviji od fajla |
-exec |
-exec cat {} \; |
Izvrsi komandu |
-delete |
-delete |
Obrisi |
-maxdepth |
-maxdepth 2 |
Ogranici dubinu |
U sledecej lekciji ucimo o wildcard-ovima i globbing-u — mehanizmu koji shell koristi za sirenje obrazaca pre nego sto ih prosledi komandama.