Что такое 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](раскрывается только в существующие файлы).