Aby w systemie Linux wyszukać wszystkie pliki z rozszerzeniem txt, znajdujące się w katalogu /home/user i zawierające w nazwie ciąg znaków abc, należy wydać polecenie
A. ls /home/user/?abc?.txt
B. ls /home/user/*abc*.txt
C. ls /home/user/[a-c].txt
D. ls /home/user/[abc].txt
Pytanie z egzaminu CKE, czerwiec 2021 (arkusz E.12-SG-21.06).
Polecenie ls /home/user/*abc*.txt dobrze spełnia warunki zadania, bo używa mechanizmu rozwijania nazw plików przez powłokę, czyli tzw. globbing. Gwiazdka * oznacza dowolny ciąg znaków, także pusty, więc zapis *abc*.txt pasuje do nazw takich jak abc.txt, plik_abc.txt, abc_kopia.txt czy raport_abc_2024.txt. Końcówka .txt wymusza rozszerzenie txt, a ścieżka /home/user/ ogranicza wyszukiwanie do wskazanego katalogu. W praktyce to bardzo szybki sposób na sprawdzenie plików w terminalu, szczególnie przy codziennej administracji Linuksem. Moim zdaniem warto jednak pamiętać, że ls z takim wzorcem działa głównie na poziomie bieżącego katalogu wskazanego w ścieżce, bez przeszukiwania podkatalogów. Jeśli trzeba szukać rekurencyjnie albo tylko zwykłych plików, lepszą praktyką administracyjną jest użycie find, np. find /home/user -type f -name '*abc*.txt'. W pytaniu chodzi jednak o dopasowanie nazwy w katalogu, więc glob *abc*.txt jest właściwym i klasycznym rozwiązaniem.
W tym zadaniu kluczowe jest rozumienie symboli wieloznacznych używanych przez powłokę Linuksa, a nie samo polecenie ls. Znak ? oznacza dokładnie jeden dowolny znak, więc wzorzec ?abc?.txt dopasuje tylko takie nazwy, w których przed abc jest jeden znak i po abc też jest jeden znak, na przykład xabcy.txt. Nie znajdzie już pliku abc.txt ani dokument_abc_kopia.txt, bo tam liczba znaków przed lub po ciągu abc jest inna. To częsty błąd: ktoś traktuje ? jak elastyczną gwiazdkę, a to zupełnie inny operator. Nawiasy kwadratowe też mają inne znaczenie niż zwykłe wpisanie tekstu. Wzorzec [abc].txt oznacza jeden znak wybrany ze zbioru a, b albo c, czyli pasuje do a.txt, b.txt lub c.txt, ale nie do nazwy zawierającej cały ciąg abc. Podobnie [a-c].txt oznacza jeden znak z zakresu od a do c, więc nadal chodzi tylko o pojedynczą literę, nie o trzyznakowy fragment nazwy. Z mojego doświadczenia najłatwiej zapamiętać to tak: * służy do dowolnie długich fragmentów nazwy, ? do jednego znaku, a [] do wyboru jednego znaku z podanego zestawu lub zakresu. Dlatego przy szukaniu plików, które mają gdziekolwiek w nazwie abc i kończą się na .txt, potrzebny jest wzorzec *abc*.txt. To jest zgodne z typową pracą w terminalu Linux/Unix i z dobrą praktyką czytelnego budowania masek nazw plików.