Шаблоны имён glob и фигурные скобки
Шаблоны имён * ? [] {}: как оболочка раскрывает их до запуска команды и чем они отличаются от регулярок.
Шпаргалка
9 команд
Версия для печати
-
*.log ? [0-9] [!a]
glob: строка / символ / диапазон / кроме
-
mkdir -p p/{src,tests,docs}
фигурные скобки
-
cp file{,.bak}
быстрый бэкап
-
echo {1..5}
последовательность
-
echo {01..10..2}
последовательность с шагом
-
shopt -s globstar
включить рекурсивный **
-
ls **/*.log
рекурсивный поиск по маске
-
shopt -s extglob
включить расширенные шаблоны
-
rm !(*.keep)
удалить всё, кроме *.keep
- glob работает с именами файлов, regex — с содержимым (grep/sed)
Обзор
Оболочка сама раскрывает шаблоны имён файлов (globbing) до запуска команды.
Это не регулярки — синтаксис другой и проще.
ls *.log
rm tmp_?
ls report-[0-9].txt
Ключи
shopt -s globstar
shopt -s nullglob
shopt -s dotglob
shopt -s nocaseglob
shopt -s extglob
shopt -s failglob
extglob-примеры: rm !(*.keep) (всё, кроме .keep), ls @(*.jpg|*.png).
Рецепты
2
| Шаблон |
Значение |
* |
любая строка (включая пустую), кроме / |
? |
ровно один символ |
[abc] [!abc] |
один из / любой кроме |
[0-9] [a-z] |
диапазон |
** |
рекурсивно по подкаталогам (при shopt -s globstar) |
Фигурные скобки {} — это не glob (раскрываются всегда, даже без файлов):
mkdir -p project/{src,tests,docs}
cp file.conf{,.bak}
mv app.{js,ts}
echo {1..5} ; echo {01..10..2}
echo img-{a,b,c}.png
- glob — для имён файлов в оболочке;
* = «что угодно».
- regex — для содержимого в grep/sed; там
* = «0+ повторов
предыдущего», а «что угодно» = .*.
Не путай: ls *.txt (glob) ≠ grep '*.txt' (regex — нужно grep '\.txt').
Неполадки
4
СимптомПричина и решение
Шаблон не нашёл файлов — команда получила сам шаблон
По умолчанию bash оставляет нераскрытый glob как есть (ls *.xyz → «нет *.xyz»).
Включи shopt -s nullglob (исчезает) или failglob (ошибка).
Скрытые файлы не попали в *
* не включает файлы на .. Используй .* отдельно или shopt -s dotglob
(осторожно: .* цепляет . и ..).
Пробелы/спецсимволы в именах ломают
Кавычь переменные; для массовой обработки — find -print0 | xargs -0 (см. xargs).
{a,b} не раскрылось
Внутри не должно быть пробелов: {a, b} не сработает. И это не glob — раскрывается
до проверки файлов.
См. также
- files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
- find — Поиск файлов по имени, размеру, времени, правам; действия над найденным.
- regex — Шаблоны для grep/sed/awk — символы, классы, якоря, группы; базовые vs расширенные.
Есть неточность? Сообщить об ошибке в статье