glob(7)

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

ОПИСАНИЕ
Давным-давно, во времена UNIX V6, существовала программа /etc/glob, которая могла раскрывать шаблоны подстановки. Очень скоро она стала встроенной функцией командной оболочки.

В наши дни существует библиотечная функция glob(3), которая выполняет эту задачу для пользовательских программ.

Следующие правила приведены в соответствии со стандартом POSIX.2, 3.13.

  Тип шаблона
A string is a wildcard pattern if it contains one of the characters '?', '*', or '['. Globbing is the operation that expands a wildcard pattern into the list of pathnames matching the pattern. Matching is defined by:

'?' (без учета кавычек) соответствует любому одному символу.

'*' (без учета кавычек) соответствует любой строке, включая пустую строку.

Классы символов

An expression "[...]" where the first character after the leading '[' is not an '!' matches a single character, namely any of the characters enclosed by the brackets. The string enclosed by the brackets cannot be empty; therefore ']' can be allowed between the brackets, provided that it is the first character. (Thus, "[][!]" matches the three characters '[', ']', and '!'.)

Диапазоны

Два символа, разделённые '-', образуют особое выражение — диапазон (то есть «[A-Fa-f0-9]» будет эквивалентен записи «[ABCDEFabcdef0123456789]»). Сюда также может входить и сам '-' в качестве начального или конечного символа (то есть «[]-]» будет соответствовать только двум символам - ']' и '-', а «[--0]» — трем символам: '-', '.', '0', так как '/' не может быть использован).

Разность множеств

An expression "[!...]" matches a single character, namely any character that is not matched by the expression obtained by removing the first '!' from it. (Thus, "[!]a-]" matches any single character except ']', 'a', and '-'.)

One can remove the special meaning of '?', '*', and '[' by preceding them by a backslash, or, in case this is part of a shell command line, enclosing them in quotes. Between brackets these characters stand for themselves. Thus, "[[?*\]" matches the four characters '[', '?', '*', and '\'.

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

Если имя файла начинается с '.', то этот символ должен быть обязательно указан в шаблоне (таким образом, 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, вызванного с пустым списком аргументов.

ЗАМЕЧАНИЯ

  Регулярные выражения
Заметим, что шаблоны не являются регулярными выражениями, хотя и похожи. Во-первых, они используются для выявления совпадений в именах файлов, а не в тексте. Во-вторых, используются разные соглашения: например, регулярное выражение '*' означает ноль или более копий предшествующему символу.

Now that regular expressions have bracket expressions where the negation is indicated by a '^', POSIX has declared the effect of a wildcard pattern "[^...]" to be undefined.

  Классы символов и интернационализация
Изначально диапазоны были определены для символов 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-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]».

СМ. ТАКЖЕ
sh(1), fnmatch(3), glob(3), locale(7), regex(7)

ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 (https://www.gnu.org/licenses/gpl-3.0.html) или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.