Шаблоны оболочки и метасимволы в Linux

Быстрые ссылки
- Что такое шаблоны
- Указание одного символа: “?”
- Соответствие нескольким символам: “*”
- Диапазоны символов в скобках
- Альтернативы через фигурные скобки и скобки
- Исключение с помощью “!” и “^”
- Отключение шаблонов через кавычки
- Включение расширенного globbing (Bash/zsh)
- Отличие glob от regex и альтернативы (find)
- Безопасный рабочий процесс при массовых операциях
Что такое шаблоны
Шаблоны оболочки (часто называют “wildcards” или “globbing”) — это специальные символы, которые оболочка заменяет списком имён файлов, совпадающих с шаблоном. Оболочка (shell) разворачивает шаблон в набор имён до запуска программы: приложение получает уже конкретные имена файлов, а не метасимволы.
Простая аналогия: шаблон действует как подстановочный знак в карточной игре — он обозначает «любую карту» нужного типа. В оболочке это позволяет выполнять команды над группами файлов одним выражением.
Важно: разные оболочки (bash, zsh, ksh, fish) имеют немного разные возможности. Базовые конструкции ?, * и [] поддерживаются повсеместно; расширенные формы требуют включения опций («extended globbing»).
Краткое определение терминов:
- Glob: механизм оболочки для сопоставления имён файлов по шаблону.
- Метасимвол/шаблон: символ, задающий множество совпадений (например, *).
Указание одного символа: “?”
Символ вопроса (?) соответствует ровно одному любому символу (кроме нулевого символа — он всегда один символ). Это удобно, когда вы знаете длину или позицию символа в имени.
Примеры:
ls photo.0?.jpgВыведет файлы типа photo.01.jpg, photo.02.jpg и т.д. Если нет совпадений, поведение зависит от оболочки: либо пустой результат, либо сообщение об ошибке.
Из соображений совместимости: ? поддерживается в bash, zsh, ksh и большинстве POSIX-совместимых оболочек.

Соответствие нескольким символам: “*”
Звёздочка (*) соответствует нулю или более символам. Это самый часто используемый метасимвол — он «жадно» берёт всё, что подходит под шаблон.
Примеры:
ls *.jpg
ls photos/*.jpg
ls *.p?
ls *d*В zsh и некоторых конфигурациях существуют расширенные формы для рекурсивного поиска:
ls ~/
ls /usr//binТройная звёздочка (*) в некоторых оболочках может проходить через символические ссылки, но это поведение зависит от реализации и настроек.
Совет безопасности: будьте аккуратны с командами типа rm * — это необратимо удалит все файлы в текущей директории. Всегда сначала проверяйте ls или используйте -i для подтверждения.

Диапазоны символов в скобках
Квадратные скобки позволяют задать набор допустимых символов или диапазон символов:
[a-z] # любая строчная буква
[A-Z] # любая заглавная буква
[0-9] # любая цифра
[a-zA-Z0-9] # любая буква или цифра
[abc] # a, b или cЧасто их комбинируют с другими шаблонами:
ls *.p[ly]Этот пример подберёт файлы, оканчивающиеся на .pl или .py.
Альтернативы через фигурные скобки и скобки
Фигурные скобки {a,b,c} расширяются оболочкой до списка слов и удобны для генерации наборов имён:
echo {cat,dog}
# → cat dog
echo {a..d}
# → a b c d
echo {1..10}
# → 1 2 3 ... 10Фигруные скобки — не тот же механизм, что и glob. Это просто текстовое разворачивание (brace expansion) до списка слов и выполняется до подстановки шаблонов.
Альтернативные группы с круглой скобкой и символом | чаще встречаются в расширенном globbing (extglob) и требуют включения опции:
ls *.(pl|py)В Bash при включённом extglob доступны конструкции:
?(pattern|pattern)— 0 или 1 повторение*(pattern|pattern)— 0 или более повторений+(pattern|pattern)— 1 или более@(pattern|pattern)— ровно 1 (альтернатива)!(pattern|pattern)— всё, что не совпадает с шаблоном

Исключение с помощью “!” и “^”
В квадратных скобках можно указать отрицание: [^...] или [!...] — оба варианта используются, хотя ^ более привычен в регулярных выражениях, а ! — в некоторых оболочках.
ls [!a-z]
ls [^a-z]В расширенном globbing (extglob) конструкция !(a|b|c) соответствует любому имени, которое не равно ни одному из перечисленных шаблонов.
Отключение шаблонов через кавычки
Иногда нужно передать символы буквально, например при поиске регулярных выражений с помощью grep. Для этого используют кавычки:
- Одинарные кавычки
'...'полностью отключают расширение оболочки внутри (никакая подстановка переменных или шаблонов не выполняется). - Двойные кавычки “…” отключают glob, но позволяют разворачивать переменные
$varи командную подстановку$(...).
Примеры:
grep '^foo' file.txt # ^ локатора начала строки будет передан как есть
pattern='^foo'
grep "$pattern" file.txt # переменная разворачивается, шаблон остаётся корректнымВключение расширенного globbing (Bash и zsh)
Bash и zsh по умолчанию поддерживают базовый набор шаблонов; для расширенных форм в Bash нужно включить опцию:
# В Bash
shopt -s extglob
# Отключить
shopt -u extglobВ zsh используются опции setopt:
# В zsh
setopt EXTENDED_GLOB
# Отключить
unsetopt EXTENDED_GLOBПосле включения вы сможете использовать конструкции +(...), *(...), ?(...), @(...), !(...).
Отличие glob от регулярных выражений (regex)
Ключевые отличия:
- Glob — это простая подстановка имён файлов внутри оболочки; он не поддерживает многих возможностей regex (группы захвата, квантификаторы типа
+?, классы POSIX и т.д.). - Regex — мощный инструмент для поиска и обработки текста (grep, sed, awk). Если нужна сложная логика соответствия внутри содержимого файлов, используйте regex.
Пример: *.txt — glob, выбирает файлы; ^foo.*bar$ — regex, находит строки, начинающиеся с foo и заканчивающиеся bar.
Альтернатива glob для поиска по файловой системе — команда find, которая поддерживает более тонкую фильтрацию и безопаснее работает в рекурсивных сценариях:
find . -type f -name "*.jpg"
find /usr -path "*/bin/*" -type dПрактические рекомендации и шаблон безопасности
Перед выполнением операций, которые могут изменить или удалить файлы, следуйте простому playbook:
- Сначала выполните команду в режиме просмотра:
lsилиechoвместоrm/cp/mv. - Если возможно, выполните резервное копирование или работайте в снепшоте/контейнере.
- Используйте
-iдля интерактивных команд (rm -i) при сомнении. - Применяйте
--для явного окончания опций, если имена файлов могут начинаться с-:
rm -- -filename- Протестируйте шаблон с
printf '%s\n':
printf "%s\n" *.logПример безопасного удаления только .tmp файлов
# Шаг 1: посмотреть, какие файлы
ls *.tmp
# Шаг 2: убедиться
printf "%s\n" *.tmp
# Шаг 3: удалить
rm -- *.tmpКогда шаблоны не работают или дают неожиданный результат
- Пустой результат: в некоторых оболочках (например, при включённом
nullglobв bash) шаблоны, не давшие совпадений, разворачиваются в пустую строку; в других — остаются неизменёнными и могут вызвать ошибку. В bash есть опцииnullglobиfailglobдля управления этим поведением:
shopt -s nullglob # шаблоны без совпадений → пустой список
shopt -s failglob # шаблоны без совпадений → ошибка- Специальные символы в именах файлов: пробелы, переносы строки, переводы каретки или символы
*?[]внутри имени — их нужно экранировать или оборачивать в кавычки. - Различия между оболочками: zsh по умолчанию ведёт себя иначе, чем bash. Например, zsh разворачивает
{1..10}немного иначе в некоторых контекстах; extglob в bash выключен по умолчанию.
Сравнение возможностей оболочек (таблица совместимости)
- bash: ? , * , [] , {..} , extglob (shopt -s extglob)
- zsh: ? , * , [] , {..} , развитые glob-операторы (setopt EXTENDED_GLOB)
- ksh: похож на bash, поддерживает большинство конструкций
- fish: имеет свои форматы сопоставления и обычно не использует стандартный POSIX-glob в точности как bash
Быстрый справочник (cheat sheet)
* # 0 или более символов
? # ровно один символ
[abc] # один символ из множества
[a-z] # диапазон
{a,b} # brace expansion: a или b -> разворачивается до списка
!(pat) # extglob: всё, что не соответствует pat
+(pat) # extglob: один или более повторений pat
@(pat) # extglob: ровно один из паттерновПолезные сценарии и приёмы
- Копирование всех файлов, кроме .git:
cp -r !( .git|.git/* ) /backup/dir # с extglob
# или
rsync -av --exclude='.git' ./ /backup/dir- Переместить файлы с расширением .log старше 30 дней:
find . -type f -name "*.log" -mtime +30 -exec mv -t /archive/ {} +- Переименование наборов файлов с помощью цикла:
for f in *.TXT; do
mv -- "$f" "${f%.TXT}.txt"
doneТест-кейсы и критерии приёмки для шаблонов
Критерии приёмки:
- Базовые шаблоны
?,*,[]корректно разворачиваются в bash и zsh. - Расширенные шаблоны работают после включения
extglob/EXTENDED_GLOB. - Кавычки предотвращают развертывание шаблонов.
- Команды безопасности (ls/echo/printf) позволяют проверить результат до выполнения «опасных» операций.
Тестовые сценарии:
printf "%s\n" a?.txtвыдаёт только файлы с ровно одним символом междуaи.txt.shopt -s nullglob; printf "%s\n" nomatch*не даёт ошибок и возвращает пустой результат.setopt EXTENDED_GLOB; echo !(a|b)не включает имена a и b.
Рольовые контрольные списки
Для начинающего пользователя:
- Проверяйте шаблон через
lsилиprintf. - Не используйте
rmбез проверки. - Экранируйте пробелы и спецсимволы.
Для разработчика:
- Используйте
findпри рекурсивной фильтрации и сложных условиях. - Автоматизируйте тесты переименования и обработки файлов.
Для системного администратора:
- Используйте rsync / tar / snapshots для бэкапов перед массовыми изменениями.
- Ограничьте доступ и проверьте скрипты на тестовой среде.
Ментальные модели и эвристики
- Подумайте о шаблоне как о запросе к «множеству имён файлов». Если вы легко сможете перечислить все имена, шаблон корректен.
- Всегда применяйте правило трёх шагов: посмотреть → подтвердить → выполнить.
- Если поведение кажется непредсказуемым — возможно, вы смешали glob и brace expansion или забыли включить extglob.
Альтернативные подходы
- find + -name / -path — более надёжный инструмент для рекурсивных поисков и фильтрации по атрибутам файлов.
- Используйте perl/python для сложной фильтрации и массовой обработки имён файлов, если glob или find не позволяют выразить логику.
Пример с Python (псевдокод):
import pathlib
for p in pathlib.Path('.').rglob('*.jpg'):
if some_complex_condition(p):
p.rename(...)Полезные примеры ошибок и когда шаблоны не подходят
- Когда нужно сопоставлять части содержимого файлов — glob не поможет; нужен grep/awk/sed или regex.
- Когда имена файлов могут содержать перевод строки — большинство инструментов ожидают одно имя на строку; лучше работать с NUL-разделителем (
find -print0иxargs -0).
Краткий глоссарий
- glob — механизм сопоставления имён файлов оболочкой
- extglob — расширенные шаблоны в bash
- brace expansion — разворачивание выражений в фигурных скобках
- regex — регулярное выражение
Примеры и шаблоны для миграции между оболочками
- Bash → zsh: большинство glob-шаблонов работают сразу, но обратите внимание на различия в расширениях и опциях. В zsh часто уже включены расширенные возможности.
- zsh → bash: включите
shopt -s extglob, если вы используете конструкции!(...)или+(...).
Примеры для социальных сетей (превью)
OG title: “Шаблоны оболочки в Linux — быстрый справочник” OG description: “Узнайте, как использовать ?, *, [], {}, ! и extglob в Bash и zsh: примеры, безопасность и альтернативы.”
Итог: шаблоны оболочки — простой и мощный инструмент для работы с наборами файлов. Начните с базовых ?, * и [], добавьте фигурные скобки для генерации списков, включите extglob при необходимости, и всегда проверяйте результат перед выполнением опасных операций.
Похожие материалы
Herodotus: защита от банковского трояна на Android
Включить новый Пуск в Windows 11
Панель полей сводной таблицы Excel — руководство
Включить новое меню «Пуск» в Windows 11 (KB5067036)
Дублирование Диспетчера задач в Windows 11: как исправить