- Основы Linux от основателя Gentoo. Часть 1 (4/4): Glob-подстановки
- Использование джокеров
- Знакомство с джокерами
- Неподходящие шаблоны
- Синтаксис джокеров: * и ?
- Синтаксис джокера: []
- Предостережения о джокерах
- Примечание:
- Подведение итогов и ссылки на другие ресурсы
- Итог
- Ссылки
- Об авторах
- Daniel Robbins
- Chris Houser
- Aron Griffis
Основы Linux от основателя Gentoo. Часть 1 (4/4): Glob-подстановки
Заключительная часть перевода первой части замечательной серии учебных пособий. Предыдущие отрывки по ссылкам: начало, второй и третий.
В данном, четвертом, отрывке рассматривается использование джокеров (wild cards) *, [] и ? для подставления путей по шаблону. А также, подводятся итоги первой части. Enjoy! 😉
Использование джокеров
Знакомство с джокерами
В повседневном использовании Linux часто случается, когда вам нужно выполнить единичную операцию (например rm) на множестве объектов файловой системы за раз. В подобных ситуациях вписывать множество файлов в командную строку, зачастую, довольно обременительно:
$ rm file1 file2 file3 file4 file5 file6 file7 file8
Для решения этой проблемы, вы можете извлечь пользу из встроенной в Linux поддержки джокеров. Эта поддержка также называется «globbing» (по историческим причинам; в русском также известно как «универсализация файловых имен» — прим. пер.), позволяет указать множество файлов за раз, используя шаблон «дикой конкатенации». Bash и другие команды Linux интерпретируют этот шаблон просматривая диск в поисках файлов, которые ему удовлетворяют. Так, если у вас есть файлы file1 до file8 в текущей рабочей директории, то можете их удалить набрав:
Или если просто хотите удалить все файлы с именами начинающимися с file, включая сам файл по имени file, вы можете набрать:
Дикая конкатенация «*» совпадает с любым символом или набором символов, или даже с их отсутствием. Разумеется, glob-джокеры возможно использовать для гораздо большего, чем простое удаление файлов, как мы увидим в дальнейшем.
Неподходящие шаблоны
Если вам необходимо перечислить все объекты файловой системы в /etc, начинающиеся с «g», а также сам g, то можно ввести:
$ ls -d /etc/g*
/etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group-
А сейчас о том, что случится если вы укажите шаблон, который не подходит ни под один объект файловой системы. В следующем примере мы попытались перебрать все файлы в /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/8* покажет все файлы в /etc, начинающиеся с десятичной цифры;
- ls /tmp/[A-Za-z]* отобразит все файлы в /tmp, которые начинаются с большой или маленькой латинской буквы.
Конструкция [!] эквивалентна конструкции [], за исключением того, что вместо совпадения с символами внутри скобок, она удовлетворяет любому символу, который НЕ перечислен между [! и ]. Пример:
- rm myfile[!9] удалит все файлы с названием myfile плюс один символ, кроме myfile9.
Предостережения о джокерах
Сейчас несколько предостережений, чтобы быть осторожными во время использования джокеров. Поскольку 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. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».