Гид по технологиям

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

8 min read Linux Обновлено 17 Sep 2025
Шаблоны оболочки в Linux — руководство
Шаблоны оболочки в Linux — руководство

Маскот 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:

  1. Сначала выполните команду в режиме просмотра: ls или echo вместо rm/cp/mv.
  2. Если возможно, выполните резервное копирование или работайте в снепшоте/контейнере.
  3. Используйте -i для интерактивных команд (rm -i) при сомнении.
  4. Применяйте -- для явного окончания опций, если имена файлов могут начинаться с -:
rm -- -filename
  1. Протестируйте шаблон с printf '%s\n':
printf "%s\n" *.log

Пример безопасного удаления только .tmp файлов

# Шаг 1: посмотреть, какие файлы
ls *.tmp
# Шаг 2: убедиться
printf "%s\n" *.tmp
# Шаг 3: удалить
rm -- *.tmp

Когда шаблоны не работают или дают неожиданный результат

  1. Пустой результат: в некоторых оболочках (например, при включённом nullglob в bash) шаблоны, не давшие совпадений, разворачиваются в пустую строку; в других — остаются неизменёнными и могут вызвать ошибку. В bash есть опции nullglob и failglob для управления этим поведением:
shopt -s nullglob   # шаблоны без совпадений → пустой список
shopt -s failglob   # шаблоны без совпадений → ошибка
  1. Специальные символы в именах файлов: пробелы, переносы строки, переводы каретки или символы *?[] внутри имени — их нужно экранировать или оборачивать в кавычки.
  2. Различия между оболочками: 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 при необходимости, и всегда проверяйте результат перед выполнением опасных операций.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Herodotus: защита от банковского трояна на Android
Безопасность

Herodotus: защита от банковского трояна на Android

Включить новый Пуск в Windows 11
Windows

Включить новый Пуск в Windows 11

Панель полей сводной таблицы Excel — руководство
Excel

Панель полей сводной таблицы Excel — руководство

Включить новое меню «Пуск» в Windows 11 (KB5067036)
Windows 11

Включить новое меню «Пуск» в Windows 11 (KB5067036)

Дублирование Диспетчера задач в Windows 11: как исправить
Windows

Дублирование Диспетчера задач в Windows 11: как исправить

Как посмотреть историю просмотра Reels в Instagram
Социальные сети

Как посмотреть историю просмотра Reels в Instagram