С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Шаблоны имён glob и фигурные скобки

4 мин bash

Шаблоны имён * ? [] {}: как оболочка раскрывает их до запуска команды и чем они отличаются от регулярок.

Шпаргалка

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) до запуска команды. Это не регулярки — синтаксис другой и проще.

bash
ls *.log                          # все файлы на .log
rm tmp_?                          # tmp_1, tmp_a (один символ)
ls report-[0-9].txt               # report-0.txt … report-9.txt

Ключи

bash
shopt -s globstar     # ** рекурсивно: ls **/*.log
shopt -s nullglob     # несовпавший glob → пусто (а не сам шаблон)
shopt -s dotglob      # * включает скрытые файлы (.bashrc и т.п.)
shopt -s nocaseglob   # без учёта регистра: *.JPG поймает .jpg
shopt -s extglob      # расширенные: !(*.bak) @(a|b) +(x) *(y) ?(z)
shopt -s failglob     # несовпавший glob → ошибка (строгие скрипты)

extglob-примеры: rm !(*.keep) (всё, кроме .keep), ls @(*.jpg|*.png).

Рецепты

2

Шаблоны

Шаблон Значение
* любая строка (включая пустую), кроме /
? ровно один символ
[abc] [!abc] один из / любой кроме
[0-9] [a-z] диапазон
** рекурсивно по подкаталогам (при shopt -s globstar)

Фигурные скобки {} — это не glob (раскрываются всегда, даже без файлов):

bash
mkdir -p project/{src,tests,docs}     # три каталога
cp file.conf{,.bak}                   # cp file.conf file.conf.bak (быстрый бэкап!)
mv app.{js,ts}                        # НЕ сработает как rename — это два аргумента
echo {1..5} ; echo {01..10..2}        # 1 2 3 4 5 ; 01 03 05 07 09 (шаг)
echo img-{a,b,c}.png                  # img-a.png img-b.png img-c.png

Glob vs regex

  • 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 расширенные.
Загрузка…