Gym
lesson

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 .* ili ls -a za 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 *.tmp pre nego sto pokrenes rm *.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!