Gymterview
junior

Что такое wildcards (glob patterns) и как их использовать?

Wildcards (маски, шаблоны подстановки, glob patterns) — это специальные символы, которые shell раскрывает в список подходящих имён файлов до передачи команде.

Аналогия

Wildcards работают как джокер в карточной игре: символ * заменяет «любую последовательность карт», ? — «ровно одну карту». Shell сам «тасует колоду» (список файлов) и подставляет подходящие.

Основные wildcards

Символ Значение Пример
* Любое количество любых символов (включая ноль) *.java — все файлы с расширением .java
? Ровно один любой символ file?.txt — file1.txt, fileA.txt
[...] Один символ из указанного набора [abc].txt — a.txt, b.txt, c.txt
[!...] или [^...] Один символ НЕ из набора [!0-9]* — не начинающиеся с цифры
{a,b,c} Перечисление вариантов (brace expansion) {dev,prod}.yml — dev.yml, prod.yml

Практические примеры

Пример
# Все Java-файлы
ls *.java

# Все файлы, начинающиеся с "App"
ls App*

# Файлы с однобуквенным именем
ls ?.txt

# Файлы с расширением .java или .xml
ls *.{java,xml}

# Диапазоны
ls file[0-9].txt           # file0.txt ... file9.txt
ls log_[a-z]*.txt          # Начинающиеся с маленькой буквы после "log_"

# Brace expansion для создания структуры проекта
mkdir -p src/{main,test}/{java,resources}
# Создаст: src/main/java, src/main/resources, src/test/java, src/test/resources

# Brace expansion с диапазонами
touch file{1..10}.txt       # file1.txt ... file10.txt
echo {01..12}               # 01 02 03 ... 12 (с ведущими нулями)

# Рекурсивный glob (bash 4+ с включённым globstar)
shopt -s globstar
ls **/*.java                # Все .java файлы рекурсивно

Важное отличие brace expansion от glob

Brace expansion {} — это механизм bash, а не glob. Он работает даже если совпадающих файлов нет (генерирует строки), тогда как * и ? раскрываются только в существующие файлы. Если ни один файл не подходит под glob, bash по умолчанию оставляет шаблон как есть (буквально *.xyz).

На собеседовании: интервьюер проверяет, понимаете ли вы, что glob-раскрытие выполняет shell до запуска команды, а не сама команда. Частая ошибка — путать brace expansion {a,b} (всегда раскрывается) с glob [ab] (раскрывается только в существующие файлы).