KWALIFIKACJA INF2 - STYCZEŃ 2020

PYTANIE NR 15.
W systemie Linux, aby wyszukać wszystkie pliki z rozszerzeniem txt, które znajdują się w katalogu /home/user i zaczynają się na literę a lub literę b lub literę c, należy wydać polecenie
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Poprawne jest ls /home/user/[a-c]*.txt, ponieważ [a-c] oznacza "pierwszy znak: a, b lub c", * dopasowuje dowolny dalszy ciąg znaków, a .txt wymusza rozszerzenie. Pozostałe wzorce albo wymagają prefiksu "abc", albo negują a/b/c, albo używają ? bez sensu dla warunku "zaczyna się na".

Pełne wyjaśnienie:

W powłoce Linuksa (np. bash) ls nie "wyszukuje" plików sam z siebie, tylko zwykle dostaje od powłoki już rozwiniętą listę nazw na podstawie wzorca (tzw. globbing).

Polecenie ls /home/user/[a-c]*.txt działa, bo:

  • /home/user/ wskazuje katalog, w którym mają być dopasowane nazwy.
  • [a-c] to klasa znaków: pierwszy znak nazwy ma być jednym z: a, b lub c (zakres od a do c).
  • * oznacza dowolny (także pusty) ciąg kolejnych znaków, więc po pierwszej literze może wystąpić dowolna reszta nazwy.
  • .txt wymusza, aby nazwa kończyła się rozszerzeniem .txt.

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

  • ls /home/user/abc*.txt dopasuje tylko pliki, które zaczynają się dokładnie od ciągu znaków "abc", a nie od pojedynczej litery a/b/c.
  • ls /home/user/[!abc]*.txt używa negacji w klasie znaków. Oznacza to "pierwszy znak to cokolwiek poza a, b, c", czyli jest przeciwieństwem wymaganego warunku.
  • ls /home/user/a?b?c?.txt wymusza konkretną strukturę nazwy: a, potem dowolny znak, potem b, potem dowolny znak, potem c, potem dowolny znak i dopiero .txt. To nie sprawdza "zaczyna się na a/b/c", tylko narzuca wzorzec z literami a, b, c w określonych pozycjach.

Wskazówka egzaminacyjna: gdy w treści jest "zaczyna się na jedną z liter", szukaj nawiasów kwadratowych [] na początku wzorca, a gdy jest "dowolna reszta nazwy", szukaj *.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Globbing to mechanizm powłoki (np. bash), który dopasowuje nazwy plików do wzorców z metaznakami, np. * i []. Dzięki temu można szybko wskazać grupę plików bez ręcznego wypisywania wszystkich nazw, np. *.txt dla plików tekstowych.
Zapis [a-c] oznacza "jeden znak z zakresu od a do c". W praktyce dopasuje pojedynczą literę: a, b albo c. To jest klasa znaków w globbingu, a nie wyrażenie regularne.
Gwiazdka * dopasowuje dowolny ciąg znaków (również pusty) po pierwszej literze. Dzięki temu dopasujesz zarówno a.txt, jak i ab123.txt. Bez * dopasowanie byłoby krótsze i bardziej restrykcyjne.
Najczęściej robi to powłoka. To bash rozwija wzorzec (np. [a-c]*.txt) do listy pasujących plików, a dopiero potem uruchamia ls z gotową listą argumentów. Dlatego podobne wzorce działają też z innymi poleceniami, np. cp czy rm.
[abc]*.txt znaczy: pierwszy znak to a lub b lub c, potem dowolna reszta i końcówka .txt. Natomiast abc*.txt wymaga, aby nazwa zaczynała się dokładnie od ciągu "abc". To częsty błąd: mylenie klasy znaków z dosłownym prefiksem.
[!abc] oznacza negację: "jeden znak, ale nie a, b ani c". Stosuje się to, gdy chcesz wykluczyć określone początki nazw, np. wyświetlić pliki, które nie zaczynają się od a/b/c. W pytaniach egzaminacyjnych to zwykle pułapka.
Znak ? dopasowuje dokładnie jeden dowolny znak. Jest mylący, bo ktoś może próbować "zbudować" nim wzorzec liter, ale wtedy narzuca też długość i pozycje znaków. Dla warunku "zaczyna się na" zwykle potrzebujesz [] i *, a nie wielu ?.
Typowy zapis to ls /home/user/[a-c]*.txt. Jeśli chcesz działanie rekurencyjne (także w podkatalogach), to samo ls nie wystarczy; zwykle używa się wtedy find z warunkami na nazwę, ale to inna technika niż globbing.
Zwykle tak: [a-c] dopasuje małe litery a–c, ale nie dopasuje wielkich A–C. Zależy to od ustawień lokalizacji i zachowania narzędzi, ale na egzaminie przyjmuj regułę, że dopasowanie jest czułe na wielkość liter, jeśli nie podano inaczej.
Najczęstsze pomyłki to: użycie abc*.txt zamiast klasy znaków, zastosowanie negacji [!...] niezgodnie z treścią, mylenie globbingu z regex oraz nadmierne używanie ?, które wymusza długość nazwy. Pomaga szybkie "rozbicie" wzorca na: pierwszy znak, reszta nazwy, rozszerzenie.
info

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

Według specjalistów z branży: "Poprawne jest ls /home/user/[a-c]*.txt, ponieważ [a-c] oznacza "pierwszy znak: a, b lub c", * dopasowuje dowolny dalszy ciąg znaków, a .txt wymusza rozszerzenie."

Źródła:

  • GNU Bash Reference Manual: "Pattern Matching" (globbing), https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching (dostęp: 2026-02-27)
  • man7.org: bash(1) — sekcja "Pattern Matching", https://man7.org/linux/man-pages/man1/bash.1.html (dostęp: 2026-02-27)
  • The Open Group Base Specifications Issue 7 (POSIX): Shell Command Language — "Pattern Matching Notation", https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html (dostęp: 2026-02-27)

Materiały:

  • Strony podręcznika systemowego: man bash (sekcja Pattern Matching)
  • Strony podręcznika: man 7 glob
  • Dokumentacja GNU coreutils: opis ls i pracy z nazwami plików

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego