17. Подстановочные символы

 

Подстановочные символы

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

$ ls -1

ответом на нее будет полный список файлов текущего каталога. Предположим, что нам надо найти файл, о котором известно только то, что его имя начинается на букву "z". Введем команду,

$ Is -1 z*

в которой аргумент z * означает все файлы, имена которых начинаются на букву "z". Пользователям DOS или Windows такое применение звездочки, вероятно, знакомо. После ввода команды оболочка Bash составляет список всех файлов, имена которых начинаются на "z" и заменяет аргумент z * этим списком. Имена файлов из списка передаются в качестве аргументов команде Is -1. В оболочке Bash возможности подстановочного символа "*" значительно шире, чем в DOS или окне DOS системы Windows.

Подстановочные символы в обозначении каталогов и файлов

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

Табл. 16.3. Применение подстановочных символов в обозначении каталогов и файлов

Символ

Описание

?

[...]

[A-F]

[ .. .] или [!...]

[ A A-F] или [IA-F]

Любой единичный символ

Любой единичный символ, заключенный в скобки

Любой единичный символ, попадающий в указанный диапазон

Любой единичный символ, кроме заключенных в скобки

Любой единичный символ, не попадающий в указанный диапазон

Рассмотрим несколько примеров.

Предположим, надо составить список всех файлов с именами длиной в три символа, первый из которых "а", а последний - "z". Это можно сделать, введя команду

$ Is -1 a?z

Если заменить вопросительный знак звездочкой, получим список файлов, имена которых просто начинаются на "а" и оканчиваются "z".

$ Is -I a*z

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

Рассмотрим ситуацию, когда необходимо получить список файлов, имена которых начинаются на а, Ь, с или d._ Для этого можно воспользоваться следующей командой.

$ Is -1 а* Ь* с* d*

Однако такая форма несколько громоздка. Гораздо удобнее воспользоваться следующей: $ Is -I [abed]*

Выражение в квадратных скобках означает любую из перечисленных букв, звездочка - любое число следующих за ней произвольных символов.

Поскольку перечисленные буквы образуют непрерывную последовательность, команду можно упростить:

$ Is -I [a-d]*

Наконец, иногда необходимо исключить один или несколько символов, включив все остальные, Рассмотрим создание сжатого архива всех исходных каталогов системы. Предположим, нужно архивировать все каталоги кроме тех, имена которых начинаются с буквы "m". Для этого можно воспользоваться командой,

$ tar czvf home.tar.gz /home/[a-1]* /home/[n-z]*

но гораздо удобнее следующая форма этой же команды:

$ tar czvf home.tar.gz /home/[!m]*

Здесь выражение в квадратных скобках обозначает любой символ, кроме буквы "m".

Можно усложнить задачу, исключив архивирование каталогов, имена которых начинаются с букв m, n или о. Соответствующая команда будет иметь вид

$ tar czvf home.tar.gz /home/[^mno]*

или

$ tar czvf home.tar.gz /home/[!m-o]*

Фигурные скобки

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

$ mkdir testdir{1,2,3,4}

По этой команде создаются четыре каталога с именами testdirl, testdir2, testdir3 и testdir4.

Обратите внимание, что элементы выражения в фигурных скобках разделены запятыми, и все они используются последовательно для образования нужных имен. Разделение элементов запятыми предполагает, что они, в отличие от элементов в квадратных скобках, могут содержать более одного символа, например:

$ mkdir testdir{01,02,03,04}

Следует учитывать, что выражение в фигурных скобках должно содержать минимум одну запятую.

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

$ mkdir newdir/{firstdir,firstdir/'dir<01,02}}

По этой команде создаются следующие кащлоги.

firstdir/dir02

В приведенной команде выражение {01,02} вложено в другое выражение в фигурных скобках.

Точно так же внутри фигурных скобок можно указывать выражения с подстановочными символами имен файлов и каталогов. По команде

$ chmod 644 testfile.{tx?,bak,0[0-9]}

происходит изменение разрешений доступа к серии файлов, в том числе ко всем файлам, соответствующим выражениям testfile. tx?, testfile.bak и от testfile.00 до testfile.09.

Подстановка команд

Еще один вариант применения подстановочных символов - подстановка команд, напоминающая конвейеризацию. При конвейеризации стандартный вывод одной команды переадресуется на стандартный ввод другой, при подстановке же он передается другой команде как аргумент или параметр.

Для примера, рассмотрим ситуацию, в которой необходимо сжать все файлы с расширением . bak. Список этих файлов можно получить, введя команду

$ find / -name '*.bak' -print

Этой же командой с флажком exec можно воспользоваться для сжатия всех файлов.

$ find / -name '*.bak r -exec gzip {} \;

Другой вариант - подстановка команды, как в следующем примере.

$ gzip "find / -name '*.bak' -print"

Здесь команда find заключена в обратные одинарные кавычки, указывающие, что ее результаты должны использоваться как часть командной строки - в данном случае, как аргументы команды gzip.

Существует альтернативная форма этой конструкции - без обратных кавычек:

$ gzip $(find / -name \*.bak -print)

Основное различие между двумя конструкциями - смысл обратной косой (\) в первой из них. Этот смысл сохраняется, если не указаны символы "$","'" или "\".

Примечание

Приведенный перечень подстановочных символов оболочки Bash не полон. Полный список, наряду с подробным описанием, можно найти на странице руководства Bash. Однако и то, что мы описали, рбеспечивает немалые возможности. Если вам понадобятся дополнительные средства- связанные с подстановочными символами, обратитесь к странице руководства, воспользовавшись командой man bash.