Gwiazdka, która robi robotę za ciebie
Po tej lekcji: kursant używa wzorców nazw (*, ?, [...]) i rozwijania nawiasów ({a,b}, {1..10}), żeby działać na wielu plikach naraz.
Wstęp
Wracasz z wakacji. Masz 800 zdjęć. Nazywają się IMG_4521.jpg, IMG_4522.jpg i tak dalej. Chcesz je wszystkie przenieść do folderu „Chorwacja 2026”.
Myszką: zaznaczasz, przeciągasz, czekasz, modlisz się, żeby nie upuścić w złym miejscu.
W terminalu:
mv IMG_*.jpg "Chorwacja 2026"/Jedna linijka. Dziś dowiesz się, co robi ta gwiazdka.
Gwiazdka: „cokolwiek”
Gwiazdka w nazwie pliku znaczy „tu może być cokolwiek, dowolnie długie, nawet nic”.
ls *.jpg
ls raport*
ls *2026**.jpg— wszystko, co kończy się na.jpg.raport*— wszystko, co zaczyna się od „raport”.*2026*— wszystko, co ma w nazwie „2026” gdziekolwiek.
To jak szukanie w szatni: „podaj mi wszystkie kurtki, które są czerwone”. Nie musisz znać numerków.
Pytajnik: „dokładnie jeden znak”
ls dane?.csvPytajnik to dokładnie jeden dowolny znak. Pasuje dane1.csv, dane2.csv, daneA.csv. Nie pasuje dane10.csv, bo tam są dwa znaki.
Nawiasy kwadratowe: „jeden z tych”
ls dane[12].csv
ls dane[0-9].csv[12] to jeden znak, ale tylko jedynka albo dwójka. [0-9] to dowolna cyfra. Czyli daneA.csv już nie pasuje.
Najważniejsza rzecz, którą trzeba zrozumieć
To nie komenda rozumie gwiazdkę. To Bash.
Kiedy wpisujesz ls *.jpg, Bash najpierw sam przegląda folder, zamienia *.jpg na listę pasujących plików, a dopiero potem woła ls z gotową listą. ls nawet nie wie, że była jakaś gwiazdka.
Jak urzędnik, który dostaje wniosek „wszystkie dokumenty z 2026 roku”, sam idzie do archiwum, wyciąga je i dopiero przekazuje dalej konkretny stos teczek.
Dlaczego to ważne? Bo tak samo działa z rm, cp, mv i każdą inną komendą. I bo zanim coś usuniesz gwiazdką, możesz zobaczyć, na co się zamieni:
echo *.tmpecho po prostu wypisze listę. Dopiero jak lista jest dobra, zamieniasz echo na rm. To jest ten nawyk, który ratuje kariery.
Nawiasy klamrowe: fabryka nazw
To już co innego. Klamry nie szukają plików, tylko produkują napisy.
echo plik{A,B,C}.txt
echo {1..5}
echo {01..10}
echo {a..e}Wynik: plikA.txt plikB.txt plikC.txt, potem cyfry od 1 do 5, potem od 01 do 10 z zerem z przodu, potem litery.
I teraz magia:
mkdir -p projekt/{src,docs,testy}
touch odcinek_{01..49}.mdPierwsza linijka robi trzy foldery naraz. Druga robi 49 plików, ponumerowanych ładnie od 01 do 49. Wszystkie lekcje tej kursu, w jednej linijce.
Gdybyś to robił myszką, skończyłbyś przy lekcji 12 i zaczął się zastanawiać nad sensem życia.
⚠ Typowy błąd
Wzorzec w cudzysłowie:
ls "*.jpg"Bash odpowie, że nie ma pliku o nazwie *.jpg. Bo cudzysłów mówi Bashowi: „nie ruszaj tego, to dosłowny napis”. Gwiazdka w cudzysłowie to zwykła gwiazdka.
Zapamiętaj: wzorce poza cudzysłowem, nazwy ze spacjami w cudzysłowie. Jak w przykładzie z hakiem: IMG_*.jpg bez cudzysłowu, a "Chorwacja 2026" z cudzysłowem.
✎ Zadanie
Jedną komendą zrób folder wakacje z podfolderami zdjecia, filmy i dokumenty. Drugą komendą zrób w zdjecia pliki od foto_001.jpg do foto_100.jpg. Trzecią wypisz, bez kasowania, tylko te, których numer kończy się na zero.
Pokaż rozwiązanie
mkdir -p wakacje/{zdjecia,filmy,dokumenty}
touch wakacje/zdjecia/foto_{001..100}.jpg
echo wakacje/zdjecia/foto_*0.jpgWyjdzie 10 plików: od foto_010 do foto_100. Jeśli wyszło Ci 11, to policz jeszcze raz, ja też za pierwszym razem doliczyłem zero.
Co dalej
Następna lekcja: dokąd idzie to, co komenda wypisuje. Bo zamiast na ekran można to wysłać do pliku. I wreszcie zaczniemy pisać do plików naprawdę.