Glob что это такое linux

Glob что это такое linux

Функция globfree() освобождает динамически хранимые в памяти данные, собранные с момента последнего вызова функции glob() .

Результаты вызова glob() сохранены в структуре, на которую указывет pglob и которая является значением glob_t , объявленным в и содержащим следующие элементы, определенные в POSIX.2 (их может быть и больше, в виде расширений):

Результаты динамически размещаются в памяти.

Параметр flags является нулем или поразрядным ИЛИ нескольких следующих символьных констант, которые меняют ход работы glob() : GLOB_ERR — выполнять возврат при ошибке чтения (например, нет прав для чтения каталога); GLOB_MARK — добавлять косую черту к каждому пути, соответствующему каталогу; GLOB_NOSORT — не сортировать найденные имена (по умолчанию они сортируются); GLOB_DOOFFS — место для pglob->gl_offs будет зарезервировано в начале списка строк, в pglob->pathv ; GLOB_NOCHECK — если не найдено совпадений по шаблону, то возвращать в качестве результата заданный шаблон; GLOB_APPEND — добавлять найденные результаты к предыдущим результатам (не следует включать этот флаг при первом вызове glob()) ; GLOB_NOESCAPE — метасимволы не могут быть ограничены символами обратной косой черты.

Используемые флаги могут быть дополнены следующими флагами (являющимися расширениями GNU и неопределенными в POSIX.2): GLOB_PERIOD (начальная точка может соответствовать метасимволам); GLOB_ALTDIRFUNC (для доступа к файловой системе использованы альтернативные функции: pglob->gl_closedir , pglob->gl_readdir , pglob->gl_opendir , pglob->gl_lstat , и pglob->gl_stat — вместо стандартных библиотечных функций); GLOB_BRACE (выражения в фигурных скобках аналогичны используемым в csh (1)); GLOB_NOMAGIC (возвращается сам шаблон, если в нем не содержатся метасимволы); GLOB_TILDE (поддерживаются расширения тильды); GLOB_ONLYDIR (ведется поиск только каталогов);

Если errfunc не равно NULL , то оно будет вызвано в случае ошибок с параметрами epath (указатель пути, в котором произошла ошибка) и eerrno. Значение errno возвращается после вызова одной из функций: opendir() , readdir() или stat() . Если errfunc вернет ненулевое значение или если флаг GLOB_ERR включен, то glob() закончит работу после вызова errfunc .

При успешном завершении работы pglob->gl_pathc содержит количество найденных совпадений имен, а pglob->gl_pathv указывает на список найденных имен. Указатель, который находится непосредственно за последним в списке имен, равен NULL .

Вызов glob() может выполняться несколько раз. В этом случае флаг GLOB_APPEND должен быть включен в flags при втором и последующих вызовах.

Как расширение GNU, pglob->gl_flags является набором указанных флагов, сложенный с GLOB_MAGCHAR (с помощью операции ИЛИ ), если обнаружены метасимволы.

Источник

Glob что это такое linux

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

Правила обработки приведены ниже (POSIX 1003.2, 3.13).

СОВПАДЕНИЕ ШАБЛОНОВ

«?» (не в квадратных скобках) соответствует любому одиночному символу.

«*» (не в квадратных скобках) соответствует любой строке, включая пустую строку.

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


Диапазоны


Исключение символов

Специальное значение «?», «*» и «[» может быть аннулировано путем экранирования их обратным слэшем (\) или в случае, когда они являются частью командной строки shell, путем заключения их в кавычки. Внутри квадратных скобок эти символы не имеют специального значения. Таким образом, «[[?*\]» совпадает с четырьмя символами: «[«, «?», «*» и «\».

ПОЛНЫЕ СОСТАВНЫЕ ПУТИ

Если полное имя файла начинается с «.», то этот символ должен быть обязательно указан в шаблоне. (Таким образом, «rm *» не удалит .profile, а «tar c *» не заархивирует все файлы; лучше использовать «tar c .» .)

ПУСТЫЕ СПИСКИ

Подобная проблема может проявиться вновь. Hапример, там, где старые скрипты использовали
, новые скрипты (для избежания сообщений об ошибках rm , вызванных с пустым списком аргументов) требуют

ЗАМЕЧАНИЯ


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

Теперь, когда в квадратных скобках регулярных выражений для отрицания используется «^», POSIX оговаривает, что эффект шаблона «[^. ]» не определен.

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

(III) Диапазоны X-Y включают в себя все символы, находящиеся между X и Y в соответствии с текущей последовательностью сортировки, определенной в категории LC_COLLATE текущей локали.

Читайте также:  Нет английской раскладки клавиатуры windows

(IV) Поименованные классы символов, такие, как:
Благодаря им можно указать значение «[[:lower:]]» вместо «[a-z]», и это будет удобным для работы в Дании, где в алфавите есть три буквы, стоящие после «z». Эти классы символов определяются категорией LC_CTYPE текущей локали.

(V) Сортировочные символы, такие, как «[.ch.]» или «[.a-acute]», строка которых, лежащая между «[.» и «.]», является элементом сортировки, определенным для текущей локали. Обратите внимание, что это может быть элемент, состоящий из нескольких символов.

(VI) Классы эквивалентности, такие, как «[=a=]», где строка между «[=» и «=]» является любым элементом сортировки из своего класса эквивалентности, определенного в текущей локали. Hапример, «[[=е=]]» может быть эквивалентно «[её]».

Источник

glob (7) — Linux Man Pages

glob: globbing pathnames

Command to display glob manual in Linux: $ man 7 glob

glob — globbing pathnames

DESCRIPTION

These days there is also a library routine glob (3) that will perform this function for a user program.

The rules are as follows (POSIX.2, 3.13).

Wildcard matching

A ‘?’ (not between brackets) matches any single character.

A ‘*’ (not between brackets) matches any string, including the empty string.

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 ‘!’.)

There is one special convention: two characters separated by ‘-‘ denote a range. (Thus, » [A-Fa-f0-9] » is equivalent to » [ABCDEFabcdef0123456789] «.) One may include ‘-‘ in its literal meaning by making it the first or last character between the brackets. (Thus, » []-] » matches just the two characters ‘]’ and ‘-‘, and » [—0] » matches the three characters ‘-‘, ‘.’, ‘0’, since ‘/’ cannot be matched.)

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 ‘\’.

Pathnames

If a filename starts with a ‘.’, this character must be matched explicitly. (Thus, rm * will not remove .profile, and tar c * will not archive all your files; tar c . is better.)

Empty lists

where perhaps no *.gif files are present (and this is not an error). However, POSIX requires that a wildcard pattern is left unchanged when it is syntactically incorrect, or the list of matching pathnames is empty. With bash one can force the classical behavior using this command:

shopt -s nullglob

(Similar problems occur elsewhere. For example, where old scripts have

new scripts require

to avoid error messages from rm called with an empty argument list.)

NOTES


Regular expressions

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.

Character classes and internationalization

(iii) Ranges X-Y comprise all characters that fall between X and Y (inclusive) in the current collating sequence as defined by the LC_COLLATE category in the current locale.

(iv) Named character classes, like

so that one can say » [[:lower:]] » instead of » [a-z] «, and have things work in Denmark, too, where there are three letters past ‘z’ in the alphabet. These character classes are defined by the LC_CTYPE category in the current locale.

(v) Collating symbols, like » [.ch.] » or » [.a-acute.] «, where the string between » [. » and » .] » is a collating element defined for the current locale. Note that this may be a multicharacter element.

(vi) Equivalence class expressions, like » [=a=] «, where the string between » [= » and » =] » is any collating element from its equivalence class, as defined for the current locale. For example, » [[=a=]] » might be equivalent to » [aáàäâ] «, that is, to » [a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]] «.

Читайте также:  Удаление мусорных файлов windows 10

Источник

Основы Linux от основателя Gentoo. Часть 1 (4/4): Glob-подстановки

Заключительная часть перевода первой части замечательной серии учебных пособий. Предыдущие отрывки по ссылкам: начало, второй и третий.

В данном, четвертом, отрывке рассматривается использование джокеров (wild cards) *, [] и ? для подставления путей по шаблону. А также, подводятся итоги первой части. Enjoy! 😉

Использование джокеров

Знакомство с джокерами

В повседневном использовании Linux часто случается, когда вам нужно выполнить единичную операцию (например rm) на множестве объектов файловой системы за раз. В подобных ситуациях вписывать множество файлов в командную строку, зачастую, довольно обременительно:

Для решения этой проблемы, вы можете извлечь пользу из встроенной в Linux поддержки джокеров. Эта поддержка также называется «globbing» (по историческим причинам; в русском также известно как «универсализация файловых имен» — прим. пер.), позволяет указать множество файлов за раз, используя шаблон «дикой конкатенации». Bash и другие команды Linux интерпретируют этот шаблон просматривая диск в поисках файлов, которые ему удовлетворяют. Так, если у вас есть файлы file1 до file8 в текущей рабочей директории, то можете их удалить набрав:

Или если просто хотите удалить все файлы с именами начинающимися с file, включая сам файл по имени file, вы можете набрать:

Дикая конкатенация «*» совпадает с любым символом или набором символов, или даже с их отсутствием. Разумеется, glob-джокеры возможно использовать для гораздо большего, чем простое удаление файлов, как мы увидим в дальнейшем.

Неподходящие шаблоны

Если вам необходимо перечислить все объекты файловой системы в /etc, начинающиеся с «g», а также сам g, то можно ввести:

А сейчас о том, что случится если вы укажите шаблон, который не подходит ни под один объект файловой системы. В следующем примере мы попытались перебрать все файлы в /usr/bin, которые начинаются с «asdf» и оканчиваются на «jkl», потенциально включая и asdfjkl:

$ ls -d /usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl: No such file or directory

Вот что случится. Обычно, когда мы задаем шаблон, и если в него укладываются один или несколько файлов в подразумеваемой файловой системе, то bash заменяет наш шаблон на разделенный пробелами список всех подходящих объектов. Однако, когда с шаблоном нет совпадений, bash оставляет переданный аргумент с джокерами как есть. Так вот, затем ls не может найти файл /usr/bin/asdf*jkl и выдает нам ошибку. Основное правило тут такое: glob-шаблоны разворачиваются только если совпадают с объектами файловой системы. В противном случае, остаются не тронутыми и буквально передаются в вызов программы.

Синтаксис джокеров: * и ?

Так, мы уже посмотрели как работает globbing, теперь же стоит рассмотреть синтаксис джокеров. В качестве джокеров используются специальные символы:

* — совпадает с нулевым или большим количеством символов. Это значит: «тут может быть все что угодно, включая и ничего». Примеры:

  • /etc/g* совпадает со всеми файлами в /etc, начинающимися с g и самим файлом g;
  • /tmp/my*1 совпадает со всеми файлами в /tmp, которые начинаются с my и заканчиваются 1, включая файл my1.

? — равен любому одному символу. Примеры:

  • myfile? совпадает с любым файлом, чье имя составляет myfile и следующим за этим какой-либо один символ;
  • /tmp/notes?txt совпадет, например, с /tmp/notes.txt и /tmp/notes_txt, если они существуют.

Синтаксис джокера: []

Этот джокер похож на ?, но более точен. Чтобы его использовать, поместите любые символы, какие вам нужны, внутрь []. Полученное выражение будет удовлетворять любому одному из этих символов. Вы также можете воспользоваться «-«, для указания диапазона, и даже комбинации диапазонов. Примеры:

  • myfile[12] совпадет с myfile1 и myfile2. Джокер сработает если хотя бы один из этих файлов существует в текущей директории;
  • [Cc]hange[Ll]og совпадет с Changelog, ChangeLog, changeLog и changelog. Как можете заметить, использование скобочных джокеров очень удобно для указания вариантов с заглавными буквами;
  • ls /etc/5* покажет все файлы в /etc, начинающиеся с десятичной цифры;
  • ls /tmp/[A-Za-z]* отобразит все файлы в /tmp, которые начинаются с большой или маленькой латинской буквы.

Конструкция [!] эквивалентна конструкции [], за исключением того, что вместо совпадения с символами внутри скобок, она удовлетворяет любому символу, который НЕ перечислен между [! и ]. Пример:

  • rm myfile[!9] удалит все файлы с названием myfile плюс один символ, кроме myfile9.
Читайте также:  Suunto ���������� ��� mac os

Предостережения о джокерах

Сейчас несколько предостережений, чтобы быть осторожными во время использования джокеров. Поскольку bash обрабатывает относящиеся к джокерам символы (?, [, ] и *) особым образом, вам надо особенно позаботиться, когда вы пишите аргумент для команды, содержащий эти символы. Например, если вы хотите создать файл, содержащий строку «[fo]*», то следующая команда может не дать желаемого результата:

$ echo [fo]* > /tmp/mynewfile.txt

Если шаблон [fo]* совпадет с какими-либо файлами в текущей рабочей директории, то вы обнаружите их имена внутри /tmp/mynewfile.txt, вместо ожидаемого [fo]*. Решение? Ну, одним из них будет огородить ваши символы в одиночные кавычки, которые сообщат bash не делать никаких раскрытий джокеров в них:

$ echo ‘[fo]*’ > /tmp/mynewfile.txt

Используя этот подход, ваш новый файл будет содержать [fo]* буквально, как и предполагалось. Также, вы можете использовать экранирующую обратную косую черту, чтобы сообщить bash, что [, ] и * должны интерпретироваться буквально, а не как джокеры:

$ echo \[fo\]\* > /tmp/mynewfile.txt

Оба подхода (одиночные кавычки и экранирующая обратная косая черта) работают с одинаковым эффектом. Поскольку мы заговорили про обработку обратной косой черты, то неплохо бы было сейчас прояснить, что на случай, если вы хотите указать \ буквально, можно либо также взять ее в одиночные кавычки, либо набрать \\ (это будет обращено в \).

Примечание:

Двойные кавычки работают также как и одиночные, но всё еще разрешают bash делать некоторую ограниченную обработку. Следовательно, одиночные кавычки — ваш лучший выбор, если вы действительно заинтересованны в буквальной передаче текста в команду. Получить больше информации о раскрытии джокеров можно набрав man 7 glob. Чтобы получить больше информации о кавычках в bash, наберите man 1 bash и прочитайте раздел под названием QUOTING. Если в ваши планы входит сдача экзаменов LPI, то рассматривайте это как свое домашнее задание. =)

Подведение итогов и ссылки на другие ресурсы

Поздравляем; Вы добрались до конца нашего обзора об основах Linux! Я надеюсь, что это помогло вам укрепить свои фундаментальные познания в Linux. Темы, которые вы здесь изучили, включая основы работы в bash, основные команды Linux, ссылки и джокеры — заложили фундамент для нашего следующего пособия об основах администрирования, в котором мы рассмотрим такие темы, как регулярные выражения, принадлежность и права доступа, управления аккаунтами пользователей, и многое другое.

Продолжая погружаться в эти учебные пособия, вы скоро достигните LPIC Level 1 сертификации от Linux Professional Institute. Говоря об этой сертификации, если это действительно то, в чем вы заинтересованы, мы рекомендуем вам изучить ресурсы из параграфа ниже, которые были внимательно подобраны к материалу освещенному в этом руководстве.

Ссылки

В серии статей «Bash в примерах», Дэниэль показывает как использовать программные конструкции bash для написания ваших собственных bash-скриптов. Эта серия (в основном 1 и 2 части) будет отличной подготовкой для LPIC Level 1:

  • Bash в примерах, Часть 1: Основы программирования в Bourne-again shell — на английском, перевод на русский ожидается
  • Bash в примерах, Часть 2: Ещё больше об основах программирования в bash — на английском, ждите перевода
  • Bash в примерах, Часть 3: Рассматриваем систему ebuild-ов — на английском, перевод будет

Продолжение.

Об авторах

Daniel Robbins

Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.

Chris Houser

Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.

Aron Griffis

Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».

Источник

Оцените статью