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

Одно из мощных средств современных оболочек (в том числе 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-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 firstdir/dir0l 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 '*.bakr-exec gzip {} \;

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

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

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

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

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

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

Примечание

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