Linux repositories inspector
Linux
2016-10-08

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages

Manual pages about using a GNU/Linux system

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

glob - шаблоны полных имён файлов

ОПИСАНИЕ

Давным-давно, во времена UNIX V6, существовала программа /etc/glob, которая могла раскрывать шаблоны подстановки. Очень скоро она стала встроенной функцией командной оболочки.
В наши дни существует библиотечная функция glob(3), которая выполняет эту задачу для пользовательских программ.
Следующие правила приведены в соответствии со стандартом POSIX.2, 3.13.

Тип шаблона

Строка считается шаблоном подстановки, если содержит в себе один из символов \(aq?\(aq, \(aq*\(aq или \(aq[\(aq. Globbing — это операция, которая раскрывает шаблон подстановки в список имён путей, соответствующих данному шаблону. Соответствие определяется следующими правилами:
\(aq?\(aq (без учета кавычек) соответствует любому одному символу.
\(aq*\(aq (без учета кавычек) соответствует любой строке, включая пустую строку.
Классы символов
Выражение «[...]», где первый символ после открывающей \(aq[\(aq - не равен \(aq!\(aq, соответствует одному символу, который может быть любым символом из набора, находящегося внутри скобок. Строка внутри скобок не может быть пустой, таким образом, \(aq]\(aq также может находиться внутри скобок и выступать в качестве первого символа (то есть «[][!]» будет соответствовать трем символам \(aq[\(aq, \(aq]\(aq и \(aq!\(aq).
Диапазоны
Два символа, разделённые \(aq-\(aq, образуют особое выражение — диапазон (то есть «[A-Fa-f0-9]» будет эквивалентен записи «[ABCDEFabcdef0123456789]»). Сюда также может входить и сам \(aq-\(aq в качестве начального или конечного символа (то есть «[]-]» будет соответствовать только двум символам - \(aq]\(aq и \(aq-\(aq, а «[--0]» — трем символам: \(aq-\(aq, \(aq.\(aq, \(aq0\(aq, так как \(aq/\(aq не может быть использован).
Разность множеств
Выражение «[!...]» соответствует одному любому символу, который не входит в множество, получаемое путем удаления первого \(aq!\(aq (то есть «[!]a-]» будет соответствовать любому одному символу за исключением \(aq]\(aq, \(aqa\(aq и \(aq-\(aq).
Специальное значение \(aq?\(aq, \(aq*\(aq и \(aq[\(aq может быть аннулировано путём экранирования их обратной косой чертой или, в случае, когда они являются частью оболочки командной строки, путём заключения их в кавычки. Внутри квадратных скобок эти символы не имеют специального значения. Таким образом, «[[?*\]» совпадает с четырьмя символами \(aq[\(aq, \(aq?\(aq, \(aq*\(aq и \(aq\\(aq.

Полные составные пути

Раскрытие (globbing) применяется к каждой части полного составного имени файла отдельно. Символ \(aq/\(aq в полном имени файла не может совпадать с шаблоном \(aq?\(aq или \(aq*\(aq, а только с диапазоном подобным «[.-0]». Диапазон не может включать в себя символ \(aq/\(aq, поскольку это будет считаться синтаксической ошибкой (в POSIX требуется, чтобы синтаксически некорректные шаблоны не изменялись).
Если имя файла начинается с \(aq.\(aq, то этот символ должен быть обязательно указан в шаблоне (таким образом, rm * не удалит .profile, а tar c * заархивирует не все файлы; лучше использовать tar c .).

Пустые списки

Выше было приведено простое и замечательное правило из оригинального определения UNIX: «раскрытие шаблона — это операция, преобразующая шаблон в список соответствующих ему полных имён файлов». Оно допускает существование шаблона, соответствующего пустому списку, например:
    xv -wait 0 *.gif *.jpg
где, возможно, файлы *.gif на самом деле отсутствуют (и это не ошибка). Несмотря на это, в POSIX требуется, чтобы шаблон, синтаксически неправильный или раскрывающийся в пустой список путей к файлам, оставался без изменений. В bash можно принудительно включить классическое поведение с помощью команды:
shopt -s nullglob
Подобная проблема может проявиться вновь. Например, там, где в старых сценариях использовалось
    rm `find . -name "*~"`
в новых сценариях используется
    rm -f nosuchfile `find . -name "*~"`
для избежания сообщений об ошибках rm, вызванного с пустым списком аргументов.

ЗАМЕЧАНИЯ

Регулярные выражения

Заметим, что шаблоны не являются регулярными выражениями, хотя и похожи. Во-первых, они используются для выявления совпадений в именах файлов, а не в тексте. Во-вторых, используются разные соглашения: например, регулярное выражение \(aq*\(aq означает ноль или более копий предшествующему символу.
Теперь, когда в квадратных скобках у регулярных выражений для отрицания используется \(aq^\(aq, в POSIX оговаривается, что эффект шаблона «[^...]» не определён.

Классы символов и интернационализация

Изначально диапазоны были определены для символов ASCII, так что «[ -%]» соответствует «[ !"#$%]», а «[a-z]» соответствует «любому символу нижнего регистра». В некоторых реализациях UNIX это обобщено так, что диапазон X-Y соответствует всем символам, коды которых находятся между X и Y. Однако, это требует знания способа кодирования символов в локальной системе и, более того, не удобно, если последовательность сортировки для локального алфавита отличается от последовательности кодов символов. Поэтому в POSIX значительно расширено обозначение квадратных скобок как для шаблонов файлов, так и для регулярных выражений. Выше встретилось три типа выражений в скобках: отрицание (i), указанный явно символ (ii) и диапазон (iii). В POSIX диапазоны определены в более удобном с точки зрения интернационализации виде, а также добавлены три новых типа:
(iii) Диапазоны X-Y включают в себя все символы, находящиеся между X и Y (включительно) в соответствии с текущей последовательностью сортировки, определённой в категории LC_COLLATE текущей локали.
(iv) Именованные классы символов, такие, как:
[:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
[:digit:]  [:graph:]  [:lower:]  [:print:]
[:punct:]  [:space:]  [:upper:]  [:xdigit:]
Благодаря им можно указать значение «[[:lower:]]» вместо «[a-z]», и это будет работать для Дании, где в алфавите есть три буквы, стоящие после «z». Эти классы символов определяются категорией LC_CTYPE текущей локали.
(v) Сортировочные символы, такие, как «[.ch.]» или «[.a-acute.]», строка которых, лежащая между «[.» и «.]», является элементом сортировки, определённым для текущей локали. Заметим, что это может быть многосимвольный элемент.
(vi) Классы эквивалентности, такие, как «[=a=]», где строка между «[=» и «=]» является любым элементом сортировки из своего класса эквивалентности, определённого в текущей локали. Например, «[[=a=]]» может быть эквивалентно «[a\(’a\(‘a\(:a\(^a]», то есть «[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]».

СМОТРИТЕ ТАКЖЕ

⇧ Top