KWALIFIKACJA INF2 - CZERWIEC 2023

PYTANIE NR 17.
Aby w systemie Linux wyszukać wszystkie pliki o dowolnej długości nazwy 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.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W bash symbol * dopasowuje dowolny ciąg znaków (także pusty). Wzorzec *abc*.txt znajdzie nazwy zawierające "abc" w dowolnym miejscu i kończące się na .txt, a ls /home/user/… wylistuje takie pliki bezpośrednio z katalogu /home/user.

Pełne wyjaśnienie:

W powłoce bash polecenie ls służy do listowania zawartości katalogu, a dopasowanie nazw plików odbywa się przez tzw. globbing (pathname expansion).

Wzorzec *abc*.txt spełnia wszystkie warunki z treści:

  • * przed "abc" oznacza "dowolny ciąg znaków" (może być też pusty), więc pasują nazwy zaczynające się od "abc" i takie, które mają coś przed nim (np. test_abc…).
  • * po "abc" oznacza "dowolny ciąg znaków" pomiędzy "abc" a końcówką, więc pasują też nazwy typu abc_file.txt albo my_abc_document.txt.
  • .txt na końcu wymusza rozszerzenie txt.

Dlatego ls /home/user/*abc*.txt wyświetli wszystkie pliki w katalogu /home/user, których nazwa zawiera ciąg "abc" i kończy się na .txt.

Dlaczego pozostałe odpowiedzi są błędne:

  • ?abc?.txt używa ?, które dopasowuje dokładnie jeden znak. To ogranicza nazwy do postaci: 1 znak + "abc" + 1 znak + ".txt", więc nie spełnia warunku "dowolnej długości nazwy".
  • [abc].txt oznacza "jeden znak z zestawu a/b/c", więc pasuje tylko do a.txt, b.txt lub c.txt, a nie do nazw zawierających "abc".
  • [a-c].txt również dopasowuje tylko jeden znak (a, b lub c) przed .txt, więc nadal nie realizuje wymagania.

Uwaga egzaminacyjna: gdyby pytanie wymagało przeszukiwania podkatalogów (rekurencyjnie), wtedy typowym narzędziem byłoby find. Tutaj jednak chodzi o dopasowanie nazw w jednym, wskazanym katalogu.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
W bash * to wildcard (glob), który dopasowuje dowolny ciąg znaków, także pusty. Dlatego wzorzec *abc* pasuje do nazw zawierających "abc" niezależnie od tego, co jest przed i po tym fragmentem.
Znak ? w globbing oznacza dokładnie jeden dowolny znak w nazwie. Wzorzec ?abc?.txt pasuje więc tylko do nazw o ściśle określonej długości (1 znak + abc + 1 znak + .txt), a nie do "dowolnej długości".
Nawiasy [] tworzą klasę znaków: [abc] dopasowuje jeden znak: a, b albo c. Wzorzec [abc].txt pasuje tylko do a.txt, b.txt lub c.txt, a nie do nazw zawierających ciąg "abc".
Zapis [a-c] to zakres znaków, czyli dopasowanie jednego znaku pomiędzy a i c (a, b lub c). Stosuje się go do krótkich wariantów nazw, np. plików numerowanych literami. Nie służy do wyszukiwania wieloznakowego ciągu "abc".
Domyślnie ls listuje tylko bezpośrednią zawartość wskazanego katalogu. Rekurencja wymaga dodatkowych opcji (np. trybu rekurencyjnego) albo użycia narzędzia typu find. W zadaniach egzaminacyjnych zwracaj uwagę na słowa "rekurencyjnie/podkatalogi".
Użyj wzorca glob, który zawiera "abc" i kończy się na .txt: ls /home/user/*abc*.txt. Pierwsza gwiazdka dopasowuje początek nazwy, druga – jej dalszą część, a końcówka .txt wymusza właściwe rozszerzenie.
Bo * może dopasować pusty ciąg znaków. Dla nazwy abc.txt pierwsza gwiazdka dopasuje "nic" przed abc, a druga gwiazdka dopasuje "nic" między abc a .txt. Dzięki temu plik abc.txt także spełnia wzorzec.
Najczęstsze pomyłki to: traktowanie ? jak "dowolny ciąg" (to rola *), mylenie [] z wyrażeniami regularnymi oraz założenie, że "wyszukać" zawsze oznacza użycie find, mimo że zadanie dotyczy tylko jednego katalogu.
find wybiera się, gdy trzeba przeszukać drzewo katalogów, filtrować po atrybutach (czas, rozmiar, właściciel) albo wykonać akcję na znalezionych plikach. Jeśli zadanie dotyczy tylko dopasowania nazw w jednym katalogu, zwykle wystarcza glob z ls.
W bash globbing działa, gdy wzorzec nie jest ujęty w cudzysłowy. Jeśli wpiszesz "*abc*.txt", gwiazdki nie zostaną rozwinięte. Dla testu możesz użyć echo z tym samym wzorcem, aby zobaczyć, jakie nazwy zostały dopasowane.
info

Około 60% zdających odpowiada poprawnie na to pytanie. średnie

Według specjalistów z branży: "W bash symbol * dopasowuje dowolny ciąg znaków (także pusty)."

Źródła:

  • GNU Bash Reference Manual: "Filename Expansion (Pathname Expansion)" oraz "Pattern Matching" (Bash manual) - https://www.gnu.org/software/bash/manual/bash.html (dostęp 2026-02-18)
  • man7.org: bash(1) manual page – sekcje dotyczące "Pathname Expansion" i wzorców *, ?, [] - https://man7.org/linux/man-pages/man1/bash.1.html (dostęp 2026-02-18)
  • GNU Coreutils Manual: "ls invocation" (opis działania ls i wzorców w kontekście powłoki) - https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html (dostęp 2026-02-18)

Materiały:

  • Dokumentacja bash: sekcja o pathname expansion (globbing)
  • Strona podręcznika: man bash (Pattern Matching, Pathname Expansion)
  • Strona podręcznika: man ls (użycie i opcje listowania)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego