Czym jest globbing i jak go używać w Linuksie?

Globbing to technika umożliwiająca dopasowywanie nazw plików za pomocą wzorców, co usprawnia pracę w wierszu poleceń. Poznaj zasady oraz zaawansowane możliwości tej metody.
Globbing jest jak wyrażenia regularne dla nazw Twoich plików. Niestety, często jest źle rozumiany, mimo że jest to podstawowa umiejętność wiersza poleceń, którą każdy zna przynajmniej w pewnym stopniu. Przekształć tę powierzchowną wiedzę w lepsze zrozumienie.
Co to jest globbing?
„Globbing” to nieformalna wersja terminu „rozszerzenie nazwy pliku”. Używając specjalnych wzorców, możesz zidentyfikować nazwy plików na podstawie wzorców zamiast dokładnych dopasowań literowych.
Pierwszym przykładem globbingu, z którym każdy się spotyka, jest taki format:
ls *.txtPokazuje on listę plików, których nazwy kończą się na rozszerzenie ".txt" w bieżącym katalogu. W tym przykładzie * pasuje do dowolnego ciągu, w tym nawet do niczego, więc dopasuje pliki o tych nazwach:
- about.txt
- a filename with spaces.txt
Nie dopasuje:
Plików ukrytych, które zaczynają się od ., są specjalnym przypadkiem. Aby dopasować pliki ukryte, musisz rozpocząć swój wzorzec od znaku „.”.
Istnieją tylko dwa inne typy dopasowań w standardowym przypadku. Wzorzec ? dopasowuje dowolny pojedynczy znak: dokładnie jeden. A wzorzec [...] dopasowuje pojedynczy znak z zamkniętego zbioru, który również może obejmować zakresy (jak a-z) i klasy znaków (jak :digit:).
Posiadając tylko te reguły, możesz zbudować dość zaawansowane wzorce, aby dopasować różne zestawy plików, zgodnie z Twoimi potrzebami. Przykładowo, możesz użyć ls [amz]*[:digit:].??, aby pokazać wszystkie pliki zaczynające się od a, m lub z i kończące się na cyfrze, po której następuje kropka i rozszerzenie składające się dokładnie z dwóch liter.
Czasami możesz zobaczyć wzorzec z użyciem klamer, jak ls *.{md,markdown}, który wyświetla wszystkie pliki kończące się na dowolnym z tych rozszerzeń. Technicznie, to rozszerzenie klamer jest oddzielne od procesu globbingu, ale często używa się obu razem.
Jak działa globbing?
Globbing jest obsługiwany przez powłokę, a nie przez polecenie, które uruchamiasz. Zastanów się, co się dzieje, gdy uruchamiasz ls *.txt. Możesz myśleć, że program ls otrzymuje „*.txt” jako argument, ustala, które pliki pasują do tego wzorca i drukuje wyniki.
W rzeczywistości powłoka jest odpowiedzialna za przekształcanie „*.txt” na „foo.txt”, „hello.txt” itd. Następnie przekazuje te wartości do polecenia ls jako argumenty. Więc ls nigdy nie musi się martwić o obsługę „*.txt”; powłoka to obsługuje.
To jest przyczyną powszechnego problemu z poleceniami takimi jak find:
find . -name *.txtUruchamiając to polecenie, spodziewałbyś się, że find zlokalizuje wszystkie pliki tekstowe w bieżącym katalogu i wszystkich jego podkatalogach. Zamiast tego Bash robi następujące:
- Widzi „*” i przekształca „*.txt” na listę pasujących nazw plików, które będą tylko z bieżącego katalogu.
- Uruchamia polecenie, np. find . -name filea.txt fileb.txt filec.txt.
Potwierdź polecenie, które Twoja powłoka faktycznie uruchomi, poprzedzając je poleceniem echo:
Teraz problem polega na tym, że find zgłosi „nieznany typ główny lub operator;” a Ty prawdopodobnie będziesz drapał się po głowie, próbując zrozumieć, co to oznacza!
Opcja -name (find nazywa to „głównym”) może przyjmować tylko jeden argument, więc find się myli, gdy widzi „fileb.txt” i zwraca.
Poprawny sposób uruchomienia tego polecenia to:
find . -name '*.txt'Cytując wyrażenie—z użyciem pojedynczych lub podwójnych cudzysłowów—oznacza, że powłoka nie wykona rozszerzenia nazwy pliku, przekazując wzorzec do find zamiast tego.
Co jeszcze może globbing?
W Bashu podstawowe znaki globbingu to *, ?, i [...]. Jednak Bash obsługuje rozszerzony zestaw znaków dzikich kart z większą funkcjonalnością. To głównie w celu wsparcia powtarzających się wzorców i zbliża globbing do pełnego dopasowania wyrażeń regularnych.
Rozszerzony globbing jest zazwyczaj włączony domyślnie, ale jeśli nie jest (np. w Bash 3.2 na macOS) musisz włączyć go za pomocą tego polecenia:
shopt -s extglobPo włączeniu będziesz mógł używać następujących:
- ?(lista-wzorców), aby dopasować 0 lub 1 wystąpienie podanych wzorców.
- *(lista-wzorców), aby dopasować 0 lub więcej wystąpień podanych wzorców.
- +(lista-wzorców) do dopasowania 1 lub więcej wystąpień podanych wzorców.
- @(lista-wzorców) do dopasowania 1 z podanych wzorców.
- !(lista-wzorców) do dopasowania czegokolwiek, co nie jest jednym z podanych wzorców.
Na przykład, możesz dopasować pliki nazwane "a", "aa" i "aaaaaa" przy użyciu wzorca +(a). Możesz dopasować pliki "README.md", "README.txt" i "README" za pomocą wzorca README?(.md|.txt).
Jeśli znasz wyrażenia regularne, łatwo zapomnieć, że globy są domyślnie kotwiczne. Oznacza to, że wzorzec taki jak +(a) będzie dopasowywał jedynie pliki, które składają się wyłącznie z znaku "a", a nie jakiekolwiek pliki, które zawierają przynajmniej jeden znak "a" gdzieś w środku.
Ponieważ globowanie jest obsługiwane przez twój shell, wspierana składnia może się różnić, dlatego zawsze powinieneś sprawdzić dokumentację swojego shella. Shell Zsh również wspiera podstawy, ale oferuje rozszerzoną składnię, która jest bliższa wyrażeniom regularnym. Na przykład, Zsh wspiera grupowanie w nawiasach, co wygląda podobnie do rozszerzonej składni Bash:
ls (plik1|plik2) Wiele shelli, w tym Bash i Zsh, dodaje funkcję rekurencyjnego globowania, gdzie możesz rozwijać dopasowania plików rekurencyjnie. Używając tego, możesz dopasować zero lub więcej katalogów za pomocą wzorca **. Tak więc ls **/*.txt znajdzie wszystkie pliki .txt w bieżącym katalogu lub w jego podkatalogach, na dowolnej głębokości:
W Bash jest to kolejna opcjonalna opcja powłoki, więc będziesz musiał ją włączyć:
shopt -s globstarWarto opanować podstawową, zgodną z POSIX, składnię do globowania: ?, *, i [...]. Dzięki tym wzorcom będziesz mógł efektywnie obsługiwać grupy plików, oszczędzając cenny wysiłek przy pisaniu. Jeśli jesteś zaangażowany w jeden konkretny shell, zdobędziesz dodatkowy bonus z nauki jego rozszerzonej składni.
Jeśli ciekawią Cię artykuły podobne do Czym jest globbing i jak go używać w Linuksie?, zajrzyj do kategorii Linux i odkryj jeszcze więcej interesujących treści.
Dodaj komentarz

Możesz być zainteresowany