Wildcard-ovi i globbing
Cilj lekcije: Razumeti shell pattern matching — kako shell prosiruje obrasce pre izvrsavanja komandi, koje specijalne karaktere mozes koristiti i kako se globbing razlikuje od regularnih izraza.
Sta je globbing?
Kada u terminalu napises:
ls *.txt
Shell ne prosledjuje *.txt direktno komandi ls. Umesto toga, shell najpre pros iruje (expand) obrazac u listu fajlova koji mu odgovaraju, pa tek onda poziva ls sa tom listom.
Ovaj proces se zove globbing (ili pathname expansion). Wildcards su specijalni karakteri koje shell interpretira kao obrasce.
ls *.txt
# shell prvobitno vidi: *.txt
# shell prosiruje u: beleske.txt poruka.txt zadatak.txt
# komanda koja se stvarno izvrsava: ls beleske.txt poruka.txt zadatak.txt
Osnovni wildcard-ovi
* (zvezdica) — bilo koji niz karaktera (ukljucujuci prazan)
Najkorisceniji wildcard. Zamenjuje bilo sta, ukljucujuci prazan string.
ls *.txt # svi fajlovi koji se zavrsavaju sa .txt
ls foto* # svi fajlovi koji pocinju sa "foto"
ls *2024* # svi fajlovi koji sadrze "2024"
ls *. # fajlovi bez ekstenzije (zavrsavaju se tackom)
Prakticni primeri:
cp *.jpg /home/student/slike/ # kopiraj sve JPEG fajlove
rm *.tmp # obrisi sve privremene fajlove
mv backup_* /mnt/arhiva/ # premesti sve backup fajlove
Napomena:
*ne odgovara fajlovima koji pocinju sa tackom (skriveni fajlovi). Koristis.*ilils -aza skrivene fajlove.
? (upitnik) — tacno jedan karakter
Zamenjuje tacno jedan karakter — bilo koji.
ls foto?.jpg # foto1.jpg, foto2.jpg, fotoA.jpg ... ali NE foto10.jpg
ls ????? # fajlovi sa tacno 5 karaktera u imenu
ls log_200?.txt # log_2001.txt, log_2002.txt ... log_2009.txt
Prakticni primeri:
cp foto?.jpg slike/ # kopiraj foto1.jpg do foto9.jpg
ls zadatak_?.md # zadatak_1.md, zadatak_2.md, ...
[abc] — jedan karakter iz navedenog skupa
Uglaste zagrade definisu skup prihvatljivih karaktera — odgovara tacno jedan karakter koji je u skupu.
ls foto[123].jpg # foto1.jpg, foto2.jpg, foto3.jpg
ls [Ll]og.txt # Log.txt ili log.txt
ls fajl[aeiou].txt # fajla.txt, fajle.txt, fajli.txt, ...
[a-z] — opseg karaktera
Crtica unutar uglastih zagrada definise opseg:
ls foto[1-5].jpg # foto1.jpg do foto5.jpg
ls [a-z]*.txt # .txt fajlovi koji pocinju malim slovom
ls [A-Z]*.conf # .conf fajlovi koji pocinju velikim slovom
ls [0-9]*.log # .log fajlovi koji pocinju cifrom
Kombinovanje opsega:
ls [a-zA-Z]*.txt # pocinje bilo kojim slovom (malo ili veliko)
ls [a-z0-9]_log.txt # pocinje malim slovom ili cifrom
[^abc] ili [!abc] — negacija skupa
Karet ^ (ili uzvicnik !) na pocetku uglastih zagrada negira skup:
ls [^0-9]*.txt # .txt fajlovi koji NE pocinju cifrom
ls foto[^1].jpg # foto?.jpg osim foto1.jpg
Vitice {} — alternativa (Brace Expansion)
Vitice nisu striktno deo globbing-a (ne moraju da odgovaraju postojecim fajlovima), ali su mocna shell karakteristika za generisanje alternativa:
ls {*.txt,*.md} # sve .txt I sve .md fajlove
cp slika.jpg {slike,backup}/ # kopira u oba direktorijuma
mkdir {jan,feb,mar,apr} # kreira 4 direktorijuma odjednom
touch fajl{1,2,3}.txt # kreira fajl1.txt, fajl2.txt, fajl3.txt
Opsezi u viticama
echo {1..10} # 1 2 3 4 5 6 7 8 9 10
echo {a..e} # a b c d e
touch log_{01..12}.txt # kreira log_01.txt do log_12.txt
mkdir -p god{2020..2024} # kreira direktorijume za svaku godinu
Korisni primeri:
# Preimovanje backup-a
mv config.txt{,.bak} # preimenuje config.txt u config.txt.bak
# Ovo se siri u: mv config.txt config.txt.bak
# {,.bak} znaci "prazan string ili .bak", pa mv dobija dva argumenta:
# original (config.txt) i kopiju sa novim sufiksom (config.txt.bak)
# Kopiranje sa preimenavanjem
cp slika.jpg{,.orig} # pravi kopiju slika.jpg.orig
# Brzo kreiranje strukture
mkdir -p projekat/{src,tests,docs,assets}
Globbing vs. Regularni izrazi
Ovo je cesta tezina tacka — globbing i regex izgledaju slicno ali su razliciti sistemi:
| Karakter | Globbing (shell) | Regex (grep, sed...) |
|---|---|---|
* |
Bilo koji niz karaktera | Nula ili vise prethodnog |
? |
Tacno jedan karakter | Nula ili jedan prethodni |
. |
Literalna tacka | Bilo koji jedan karakter |
[abc] |
Jedan od skupa | Jedan od skupa (isto) |
[^abc] |
Nije iz skupa | Nije iz skupa (isto) |
{a,b} |
Alternativa | Nije podrzan (u basicnom) |
+ |
Nema znacenja | Jedan ili vise prethodnog |
^ |
Nema znacenja | Pocetak linije |
$ |
Nema znacenja | Kraj linije |
Kljucna razlika: *
# Globbing: *.txt znaci "bilo koji niz karaktera" + ".txt"
ls *.txt # pronalazi fajlove: beleske.txt, a.txt, test123.txt
# Regex: * znaci "nula ili vise prethodnog karaktera"
grep "go*gle" fajl.txt # pronalazi: ggle, gogle, google, gooogle
Kljucna razlika: .
# Globbing: tacka je LITERALNA tacka
ls *.txt # tacka u .txt je obicna tacka
# Regex: tacka znaci BILO KOJI karakter
grep "g.p" fajl.txt # pronalazi: gap, gop, g3p, g p...
Pravilo: Koristis globbing kada radis sa imenima fajlova u shell-u. Koristis regex unutar alata kao sto su
grep,sed,awk.
Prakticni primeri
ls i pretraga
ls *.txt # svi .txt fajlovi
ls foto[1-3].jpg # foto1.jpg, foto2.jpg, foto3.jpg
ls [Dd]okument* # Dokument... ili dokument...
ls ??.conf # .conf fajlovi sa 2-slovnim imenom
cp i mv
cp foto[1-3].jpg slike/ # kopiraj specificne fotografije
mv *.bak backup/ # premesti sve backup fajlove
cp /etc/*.conf /home/student/konfig/ # kopiraj sve konfiguracione fajlove
rm (oprez!)
rm *.tmp # obrisi privremene fajlove
rm log_200?.txt # obrisi log fajlove iz 2000-2009
Upozorenje: Uvek proveri
ls *.tmppre nego sto pokrenesrm *.tmp. Globbing greske mogu biti katastrofalne!
Kreiranje fajlova i direktorijuma
touch beleska_{01..10}.txt # beleska_01.txt do beleska_10.txt
mkdir -p {jan,feb,mar}/{izvestaji,podaci}
touch log_{2024..2026}_{01..12}.txt
Navodnici i globbing
Navodnici kontrolisu da li ce shell interpretirati specijalne karaktere:
# Bez navodnika — globbing se primenjuje
echo *.txt # ispisuje: beleske.txt poruka.txt zadatak.txt
# Jednostruki navodnici — sve je literalno
echo '*.txt' # ispisuje: *.txt
# Dvostruki navodnici — globbing se ne primenjuje, ali $VAR i backtick se interpretiraju
echo "*.txt" # ispisuje: *.txt
Ovo je vazno kada radis sa find:
# POGRESNO — shell prosiruje *.txt pre nego sto prosledi find-u
find /home/student -name *.txt
# ISPRAVNO — navodnici sprecavaju shell globbing, find dobija obrazac
find /home/student -name "*.txt"
Rezime
| Wildcard | Znacenje | Primer |
|---|---|---|
* |
Bilo koji niz karaktera (i prazan) | ls *.log |
? |
Tacno jedan karakter | ls foto?.jpg |
[abc] |
Jedan karakter iz skupa | ls [abc]*.txt |
[a-z] |
Jedan karakter iz opsega | ls [a-z]*.txt |
[^abc] |
Nije iz skupa | ls [^0-9]*.txt |
{a,b} |
Alternativa (brace expansion) | ls {*.txt,*.md} |
{1..5} |
Opseg (brace expansion) | touch log_{1..5}.txt |
Kljucne razlike koje treba zapamtiti:
- Globbing se dogadja u shell-u, pre pozivanja komande
*u globbing-u = "bilo sta", u regex-u = "nula ili vise prethodnog"- Koristis navodnike da onemogucis globbing kada treba (npr. uz
find -name)
Nastavljamo sa vezbaom — primeni sve sto si naucio o pretrazi!