Подстановочные символы (wildcards) в 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@ но не fileA5. Фигурные скобки: { }
Фигурные скобки — это не 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.txtBrace 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 extglob10. Чувствительность к регистру
Шаблоны 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 -delete14. Чек‑лист для ролей
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. Мини‑методология: безопасное массовое удаление
echoилиlsшаблона, чтобы увидеть совпадения.- Если совпадений много, перенаправьте список в файл:
ls pattern > /tmp/matches.txt. - Проверьте
/tmp/matches.txtвручную или скриптом. - Используйте
xargs -p rmдля поэтапного подтверждения.
Пример:
ls *.bak > /tmp/remove-list.txt
# проверить /tmp/remove-list.txt
cat /tmp/remove-list.txt | xargs -p rm19. Ментальные модели и эвристики
- “*” = “всё, что угодно (в этой части имени)”.
- “?” = “ровно один символ здесь”.
- “[]” = “любой из перечисленных”; добавьте “!” для исключения.
- “{}” = “перечисление вариантов, расширение списка”.
Когда не уверены — сначала echo.
20. Короткие примеры для практики
- Переименовать все
.txtв.bak(предварительно проверить):
# проверить
ls *.txt
# переименовать с помощью цикла
for f in *.txt; do mv -- "$f" "${f%.txt}.bak"; done- Найти все изображения и упаковать:
shopt -s globstar
tar -czf images.tar.gz **/*.{jpg,png,gif}
shopt -u globstar21. Решение: выбирать 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. Начните с * и ?, затем изучите [], {} и расширенные возможности оболочки. Всегда проверяйте результаты перед массовыми изменениями, учитывайте скрытые файлы и локаль.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента