Gym
lesson

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 komandi find.

-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 find pronalazi 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.