В программировании шаблоны glob ( / ɡ l ɒ b / ) определяют наборы имен файлов с подстановочными знаками . Например, команда оболочки Unix Bash перемещает все файлы с именами, заканчивающимися на , из текущего каталога в каталог . Здесь — подстановочный знак, а — шаблон glob. Подстановочный знак означает «любую строку любой длины, включая пустую, но исключая символы-разделители пути ( в Unix и Windows)».mv *.txt textfiles/
.txt
textfiles
*
*.txt
*
/
\
Другим распространенным подстановочным знаком является вопросительный знак ( ?
), который обозначает один символ. Например, переместит все файлы, имена которых содержат один символ, за которым следует , из текущего каталога в каталог , в то время как будет соответствовать всем файлам, имена которых состоят из 2 символов, за которыми следует .mv ?.txt shorttextfiles/
.txt
shorttextfiles
??.txt
.txt
Помимо сопоставления имен файлов, глобусы также широко используются для сопоставления произвольных строк ( сопоставление с подстановочными знаками ). В этом качестве распространенным интерфейсом является fnmatch
.
Команда glob, сокращение от global , появилась в самых ранних версиях Bell Labs' Unix . [1] Командные интерпретаторы ранних версий Unix (с 1-го по 6-е издание, 1969–1975) полагались на отдельную программу для расширения подстановочных знаков в аргументах без кавычек команды: /etc/glob . Эта программа выполняла расширение и предоставляла команде расширенный список путей к файлам для выполнения.
Glob изначально был написан на языке программирования B. Это была первая часть основного программного обеспечения Unix, разработанная на языке программирования высокого уровня . [2] Позже эта функциональность была предоставлена как функция библиотеки C , glob()
, используемая такими программами, как shell . Обычно она определяется на основе функции с именем fnmatch()
, которая проверяет, соответствует ли строка заданному шаблону — программа, использующая эту функцию, затем может перебирать ряд строк (обычно имен файлов), чтобы определить, какие из них соответствуют. Обе функции являются частью POSIX : функции, определенные в POSIX.1 с 2001 года, и синтаксис, определенный в POSIX.2. [3] [4] Идея определения отдельной функции сопоставления началась с wildmat (сопоставление с подстановочными знаками), простой библиотеки для сопоставления строк с подстановочными знаками Bourne Shell.
Традиционно globs не соответствуют скрытым файлам в форме точечных файлов Unix ; чтобы соответствовать им, шаблон должен явно начинаться с .
. Например, *
соответствует всем видимым файлам, а .*
соответствует всем скрытым файлам.
Наиболее распространенными подстановочными знаками являются *
, ?
, и […]
.
Обычно символ-разделитель пути ( /
в Linux/Unix, MacOS и т. д. или \
в Windows) никогда не будет сопоставлен. Некоторые оболочки, такие как Bash, имеют функциональность, позволяющую пользователям обойти это. [5]
В Unix-подобных системах определяется так же, как указано выше, но *
имеет два дополнительных значения: [6] [7]?
[…]
Диапазоны также могут включать предопределенные классы символов, классы эквивалентности для акцентированных символов и символы сортировки для труднопечатаемых символов. Они определены для соответствия скобкам в регулярных выражениях POSIX. [6] [7]
Подстановка Unix обрабатывается оболочкой в соответствии с традицией POSIX. Подстановка предоставляется для имен файлов в командной строке и в скриптах оболочки . [8] Предписанный POSIX case
оператор в оболочках обеспечивает сопоставление с шаблоном с использованием шаблонов подстановки.
Некоторые оболочки (например, оболочка C и Bash ) поддерживают дополнительный синтаксис, известный как чередование или расширение фигурных скобок . Поскольку он не является частью синтаксиса glob, он не предоставляется в case
. Он раскрывается только в командной строке перед glob.
Оболочка Bash также поддерживает следующие расширения: [9]
extglob
опцию оболочки. Эта опция пришла из ksh93. [10] GNU fnmatch и glob имеют одинаковое расширение. [3]**
самостоятельно, в качестве компонента имени, рекурсивно сопоставлять любое количество слоев не скрытых каталогов. [10] Также поддерживается библиотеками JavaScript и glob Python .Оригинальный DOS был клоном CP/M, разработанным для работы на процессорах Intel 8088 и 8086. Оболочки Windows, следуя DOS, традиционно не выполняют никаких расширений glob в аргументах, передаваемых внешним программам. Оболочки могут использовать расширение для своих собственных встроенных команд:
[…]
и *
может появляться только в конце шаблона. Он не может появляться в середине шаблона, за исключением непосредственно предшествующего разделителю расширения имени файла — точке.Программы Windows и DOS получают длинную строку командной строки вместо параметров в стиле argv, и они несут ответственность за выполнение любого разделения, кавычек или расширения glob. Технически нет фиксированного способа описания подстановочных знаков в программах, поскольку они вольны делать то, что хотят. Два распространенных расширителя glob включают: [12]
?
и *
. [13] И ReactOS (crt/misc/getargs.c), и Wine (msvcrt/data.c) содержат совместимую реализацию с открытым исходным кодом __getmainargs
, функции, работающей «под капотом», в их ядре CRT.dcrt0.cc
glob()
Большинство других частей Windows, включая службу индексирования, используют стиль MS-DOS подстановочных знаков, найденных в CMD. Этот синтаксис, являющийся пережитком эпохи имен файлов 8.3, уделяет особое внимание точкам в шаблоне и тексту (имени файла). Внутри это делается с помощью трех дополнительных подстановочных знаков, <>"
. На стороне API Windows эквивалентом glob() является FindFirstFile , а fnmatch() соответствует его базовому RtlIsNameInExpression . [14] (Другой аналог fnmatch — PathMatchSpec .) Оба расширителя msvcrt с открытым исходным кодом используют FindFirstFile , поэтому особенности имен файлов 8.3 также будут применяться в них.
Оператор SQL LIKE
имеет эквивалент ?
and, *
но не […]
.
Стандартный SQL использует синтаксис типа glob для простого сопоставления строк в своем LIKE
операторе, хотя термин «glob» обычно не используется в сообществе SQL. Знак процента ( %
) соответствует нулю или более символов, а подчеркивание ( _
) соответствует ровно одному.
Многие реализации SQL расширили LIKE
оператор, чтобы обеспечить более богатый язык сопоставления с шаблонами, включая диапазоны символов ( […]
), их отрицание и элементы регулярных выражений. [15]
Глобы не включают синтаксис для звезды Клини , которая допускает многократное повторение предыдущей части выражения; таким образом, они не считаются регулярными выражениями , которые могут описывать полный набор регулярных языков по любому заданному конечному алфавиту. [16]
Глобы пытаются сопоставить всю строку (например, S*.DOC
сопоставляют S.DOC и SA.DOC, но не POST.DOC или SURREY.DOCKS), тогда как, в зависимости от деталей реализации, регулярные выражения могут сопоставлять подстроку.
Оригинальная реализация автоконфигурации прокси Mozilla , которая обеспечивает функцию соответствия глобуса строкам, использует реализацию replace-as-RegExp, как указано выше. Синтаксис скобок в таком примере оказывается покрытым регулярным выражением.
Функция fnmatch в Python использует более сложную процедуру для преобразования шаблона в регулярное выражение. [17]
Помимо использования в оболочках, шаблоны globs также находят применение в различных языках программирования, в основном для обработки ввода человеком. Интерфейс в стиле glob для возврата файлов или интерфейс в стиле fnmatch для сопоставления строк встречаются в следующих языках программирования:
Glob
. [18] или DotNet.Glob
. [19]globMatch
функцию в std.path
модуле. [20]minimatch
, которая используется внутри npm , и micromatch
, которая, как утверждается, является более оптимизированной, точной и безопасной реализацией подстановки, используемой Babel и yarn. [21] [22]Glob
функцию в filepath
пакете. [23]Files
класс, содержащий методы, которые работают с шаблонами глобусов. [24]Glob
пакет с основным модулем System.FilePath.Glob
. Синтаксис шаблона основан на подмножестве Zsh 's. Он пытается оптимизировать заданный шаблон и должен быть заметно быстрее, чем наивный посимвольный сопоставитель. [25]glob
функция (как обсуждалось в книге Ларри Уолла «Программирование Perl »), так и расширение Glob , которое имитирует процедуру BSD glob. [26] Угловые скобки Perl также можно использовать для glob: <*.log>
.glob
функция. [27]glob
В стандартной библиотеке Python есть модуль, который выполняет сопоставление шаблонов подстановочных знаков в именах файлов, [28] и fnmatch
модуль с функциями для сопоставления строк или фильтрации списков на основе этих же шаблонов подстановочных знаков. [17] Гвидо ван Россум , автор языка программирования Python, написал и внес подпрограмму glob
в BSD Unix в 1986 году. [29] Существовали и предыдущие реализации glob
, например, в программах ex и ftp в предыдущих выпусках BSD.glob
метод для Dir
класса, который выполняет сопоставление шаблонов с именами файлов. [30] Несколько библиотек, таких как Rant и Rake, предоставляют FileList
класс, который имеет метод glob или используют этот метод FileList.[]
идентично.GLOB
функция.