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

Подстановочные символы (wildcards) в Linux: понятное руководство и примеры

• 6 min read • Linux • Обновлено 25 Nov 2025
Подстановочные символы в Linux: руководство
Подстановочные символы в Linux: руководство

Иллюстрация: подстановочные символы в Linux

Подстановочные символы (wildcards, часто называемые glob-паттернами) — это короткие шаблоны, которые оболочка (shell) расширяет в список имён файлов и директорий. Они не являются программами; это синтаксис оболочки (bash, zsh и т. п.). В этой статье вы найдёте простые правила, практические примеры, подводные камни и чек‑листы для разных ролей.

Что такое glob (коротко)

Globbing — это процесс, когда оболочка заменяет шаблон с подстановочными символами реальными именами файлов. Регулярные выражения — другое средство (они не автомагически разворачиваются оболочкой в имена файлов). Одной строкой: glob = шаблон файлов, regexp = поиск внутри текста.

Основные сценарии использования

  • Быстрая фильтрация списка файлов в ls, cp, mv, rm, tar, scp и т. д.
  • Автоматизация в скриптах: передача группы файлов на обработку.
  • Комбинация с find для рекурсивного поиска.

Важное замечание

Подстановочные символы расширяются оболочкой до того, как команда получает аргументы. Это означает: если шаблон совпадает с файлами — команда получит список имён; если совпадений нет — результат зависит от настроек оболочки (в bash по умолчанию шаблон остаётся как есть, но это можно изменить).

1. Звёздочка: * (H2)

* соответствует нулю или более любым символам, кроме разделителя пути /.

Примеры:

ls *.txt        # все файлы, заканчивающиеся на .txt
ls example*     # все файлы, начинающиеся с example
ls *_1          # все файлы, заканчивающиеся на _1
ls *ample*      # файлы, содержащие подстроку "ample"

Примечания:

  • * не проходит через /: шаблон */file.txt найдёт dir/file.txt, но не dir/subdir/file.txt.
  • Для поиска рекурсивно используйте find или ** в оболочках, где включено рекурсивное глоббирование (bash с shopt globstar).

Пример с проверкой перед удалением:

echo rm *.bak   # сначала увидите список файлов, которые будут удалены
rm *.bak         # удалить после проверки

Скрытые файлы и точка

В Unix-подобных системах скрытые файлы начинаются с точки ., например .bashrc. Шаблон * не совпадает с именами, начинающимися с точки, если вы явно не включите точку:

ls .*            # список скрытых файлов и директорий в текущей папке
ls .*.conf       # файлы, начинающиеся с точки и заканчивающиеся на .conf

Важно: ls .* вернёт также . и .. — будьте осторожны при использованием с командами вроде rm.

Пример: команда показывает скрытые файлы с подстановочными символами

2. Вопросительный знак: ?

? соответствует ровно одному любому символу (кроме /).

Примеры:

ls file?.txt        # file1.txt, fileA.txt, но не file10.txt
ls example??.txt    # example01.txt или exampleAB.txt (ровно 2 символа между example и .txt)
ls ?ile*            # любой один символ + "ile" + что угодно

Когда использовать: когда фиксировано количество символов, которое вы хотите разрешить в этом месте имени.

3. Квадратные скобки: [ ]

[abc] соответствует любому одному символу из перечисленных внутри скобок. Также поддерживаются диапазоны.

Примеры:

ls [1ab]file.txt    # 1file.txt, afile.txt, bfile.txt
ls file[0-9].txt    # file0.txt .. file9.txt
ls file[!a-z].txt   # в bash и POSIX-совместимых оболочках исключение: любой символ, кроме a..z

Поддержка диапазонов зависит от локали: в некоторых локалях диапазон a-z включает дополнительные символы. Для стабильного поведения используйте POSIX-локаль (например, LC_ALL=C).

4. Отрицание в скобках: [!…]

Если первый символ внутри скобок — ! (или ^ в некоторых оболочках), шаблон означает «любой символ, кроме перечисленных».

ls file[!a-zA-Z]   # file1, file_, file@ но не fileA

5. Фигурные скобки: { }

Фигурные скобки — это не wildcard в смысле совпадения символов, а механизм расширения списка значений (brace expansion). Они разворачиваются до набора слов.

ls file{1,2,3}.txt    # эквивалент: ls file1.txt file2.txt file3.txt
mv report{,-old}.txt   # mv report.txt report-old.txt

Brace expansion выполняется до глоббинга, поэтому комбинации дают мощные шаблоны.

6. Комбинирование шаблонов

Вы можете миксовать *, ?, [] и {} для точных подборок:

ls data_[0-9][0-9].{csv,tsv}   # все data_01.csv, data_02.tsv и т. п.

7. Globbing vs регулярные выражения

  • Globbing: простые шаблоны (expansion) оболочки, быстро и удобно для имён файлов.
  • Регулярные выражения: более мощные и гибкие, используются в grep, sed, awk и т. п., но не разворачиваются оболочкой в список файлов.

Если нужно рекурсивно искать по шаблону имён, используйте find с -name (glob-паттерн) или -regex (регулярные выражения):

find Documents -name "*.txt"
find /var/log -regex ".*\.log$"

8. Рекурсивный глоббинг (globstar)

Bash поддерживает для рекурсивного поиска, если включить опцию globstar:

shopt -s globstar
ls /*.py    # все .py файлы во всех подкаталогах
shopt -u globstar

Без globstar ** ведёт себя как * или конкретно зависит от оболочки.

9. Расширенные шаблоны (extglob) в bash

Bash может включить расширенные шаблоны, которые больше похожи на альтернативы:

shopt -s extglob
ls !(temp*)       # всё, кроме имён, начинающихся с temp
ls +(a|b)*         # имена, начинающиеся с a или b
ls ?(a|b)*         # необязательное a или b, затем всё остальное
shopt -u extglob

10. Чувствительность к регистру

Шаблоны glob по умолчанию чувствительны к регистру. Чтобы сделать глоббирование нечувствительным, можно включить опцию оболочки:

shopt -s nocaseglob
ls [fF]ile.txt  # альтернативный способ: явно указывать класс символов
shopt -u nocaseglob

Или в find использовать -iname для нечувствительного поиска по имени:

find . -iname "file.txt"

11. Безопасность и осторожность

  • Никогда не выполняйте rm с шаблоном, не проверив результат через echo или ls.
  • Учитывайте, что .* включает . и .. — не делайте rm -rf .* в корне.
  • В скриптах обрабатывайте случаи, когда шаблон не совпал (проверяйте, что список файлов не пуст).

12. Частые ошибки и когда шаблоны НЕ сработают

  • Ожидание, что * пройдёт через / (не пройдет).
  • Ожидание, что glob выполнит поиск в подкаталогах без включения globstar или find.
  • Проблемы из‑за локали при диапазонах в [].
  • Ошибки при совпадении скрытых файлов, если не учитывать точку ..

13. Альтернативные подходы

  • find — для рекурсивного поиска и сложных фильтров (по дате, размеру и т. д.).
  • grep -l в сочетании с find — поиск содержимого файлов.
  • Регулярные выражения (sed/awk/perl) — когда шаблон внутри строки, а не имени.

Пример: найти все .log файлы старше 7 дней и удалить после проверки:

find /var/log -name "*.log" -mtime +7 -print
# проверить список, затем
find /var/log -name "*.log" -mtime +7 -delete

14. Чек‑лист для ролей

Sysadmin:

  • Всегда смотреть результат echo или ls перед rm.
  • Включать globstar для скриптов, если нужен рекурсивный матч, и фиксировать это в шапке скрипта.
  • Использовать find для ограничений по времени/размеру/пользователю.

Разработчик:

  • В тестах явно указывать имена файлов, а не полагаться на глоббинг, чтобы избежать хрупких тестов.
  • При парсинге путей использовать функции языка (например, Pathlib в Python), а не полагаться на оболочку.

Power user / DevOps:

  • Использовать shopt -s extglob для сложных шаблонов, но документировать это в скрипте.
  • Приводить локаль к известному значению (LC_ALL=C) при использовании диапазонов.

15. Быстрая шпаргалка (cheat sheet)

ШаблонОписаниеПример

| | 0 или более символов | `.txt| ? | ровно 1 символ |file?.txt| [abc] | один символ из набора |file[12a].txt| [!a-z] | любой символ, кроме указанных |file[!a-z].txt| {a,b,c} | расширение списка (не wildcard) |file{1,2}.txt| ** (globstar) | рекурсивно во вложенных каталогах (bash) |*/.py`

(Таблица для быстрого запоминания — копируйте в заметки.)

16. Примеры тест-кейсов (приёмочных критериев)

  • Проверка ls *.txt возвращает только файлы с .txt.
  • Проверка ls ?ile возвращает file? нет — должно возвращать имена длиной 4 символа, заканчивающиеся на ile.
  • Проверка shopt -s globstar + ls **/*.sh находит скрипты в подкаталогах.
  • Проверка ls .* не приводит к ошибке при последующем rm (перед удалением должен быть ручной контроль).

17. Потенциальные проблемные случаи (gallery edge cases)

  • Имена файлов с пробелами, переносами строки или управляющими символами — всегда оборачивайте в кавычки при необходимости.
  • Имя файла, начинающееся с - (дефис) может быть воспринято как опция; используйте -- перед списком файлов: rm -- -file.
  • Локализация: диапазон A-Z в одной локали может отличаться от другой.

18. Мини‑методология: безопасное массовое удаление

  1. echo или ls шаблона, чтобы увидеть совпадения.
  2. Если совпадений много, перенаправьте список в файл: ls pattern > /tmp/matches.txt.
  3. Проверьте /tmp/matches.txt вручную или скриптом.
  4. Используйте xargs -p rm для поэтапного подтверждения.

Пример:

ls *.bak > /tmp/remove-list.txt
# проверить /tmp/remove-list.txt
cat /tmp/remove-list.txt | xargs -p rm

19. Ментальные модели и эвристики

  • “*” = “всё, что угодно (в этой части имени)”.
  • “?” = “ровно один символ здесь”.
  • “[]” = “любой из перечисленных”; добавьте “!” для исключения.
  • “{}” = “перечисление вариантов, расширение списка”.

Когда не уверены — сначала echo.

20. Короткие примеры для практики

  1. Переименовать все .txt в .bak (предварительно проверить):
# проверить
ls *.txt
# переименовать с помощью цикла
for f in *.txt; do mv -- "$f" "${f%.txt}.bak"; done
  1. Найти все изображения и упаковать:
shopt -s globstar
tar -czf images.tar.gz **/*.{jpg,png,gif}
shopt -u globstar

21. Решение: выбирать glob или find?

flowchart TD
  A[Нужен поиск по имени] --> B{Рекурсивно?}
  B -->|Нет| C[Использовать glob в оболочке]
  B -->|Да| D[Использовать find]
  D --> E{Нужны фильтры по времени/размеру?}
  E -->|Да| F[find с -mtime/-size]
  E -->|Нет| G[find -name '*.ext']

22. Короткий глоссарий (1 строка)

  • glob: шаблон оболочки для имён файлов; regexp: регулярное выражение для текста.

23. FAQ

Q: Чем отличаются * и **?

A: * соответствует любым символам в пределах одной директории; ** при включённом globstar соответствует каталогу и всем его подкаталогам рекурсивно.

Q: Как безопасно удалить скрытые файлы с шаблоном?

A: Не используйте rm .*. Сначала проверьте ls -d .[!.]* или конкретизируйте шаблон, избегая .. и ..


Краткое резюме: подстановочные символы — простой и мощный инструмент для работы с файлами в Linux. Начните с * и ?, затем изучите [], {} и расширенные возможности оболочки. Всегда проверяйте результаты перед массовыми изменениями, учитывайте скрытые файлы и локаль.

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

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

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро