Вы, вероятно,
уже использовали символы
подстановка,
не зная, что это такое. Если вы указываете
файл в Windows® или выполняете поиск файла,
вы используете *
для установки
соответствия случайной строке. Например,
*.txt
соответствует всем файлам
с именами, заканчивающимися на
.txt
. Мы также часто использовали
это в последнем разделе. Но кроме
*
существует еще много других
подстановок.
Когда вы вводите команду типа ls
*.txt и нажимаете на Enter,
задача по нахождению файлов,
соответствующих шаблону *.txt
,
выполняется не командой ls, а самим
shell
'ом. Требуется некоторое пояснение
того, как командная строка
интерпретируется shell
'ом. Когда вы
вводите:
$ ls *.txt readme.txt recipes.txt
командная строка разбивается сначала на
слова (ls
и *.txt
в этом
примере). Когда командный процессор видит
в слове *
, он будет
интерпретировать все слово как шаблон
универсализации и будет заменять его
именами всех соответствующих файлов.
Поэтому команда, перед тем как командный
процессор ее исполнит, принимает вид
ls readme.txt recipe.txt, что и дает
ожидаемый результат. Другие символы также
заставляют командный процессор
реагировать подобным образом:
?
: соответствует одному и
только одному символу, независимо от того,
чем является этот символ;
[...]
: соответствует любому
символу, найденному в скобках. Символы
могут быть заданы или в виде диапазона
символов (т.е. 1-9
), или в виде
дискретных
значений, или даже в двух видах
одновременно. Пример: [a-zBE5-7]
будет соответствовать всем символам
между a
и z
, а также
символам B
, E
,
5
, 6
или 7
;
[!...]
: соответствует любому
символу не найденному в
скобках. [!a-z]
, например, будет
соответствовать любому символу, который
не является буквой в нижнем
регистре[14];
{c1,c2}
: соответствует
c1
или c2
, где
c1
и c2
также
являются шаблонами подстановки. Это
означает, что вы, например, можете
написать {[0-9]*,[acr]}
.
Далее представлено несколько шаблонов и их значения:
/etc/*conf
: все файлы в каталоге
/etc
с именами,
заканчивающимися на conf
. Этому
могут соответствовать файлы
/etc/inetd.conf
,
/etc/conf.linuxconf
, , а также
/etc/conf
, если такой файл
существует. Помните, что *
также может соответствовать пустой
строке.
image/{cars,space[0-9]}/*.jpg
: все
файлы с именами, заканчивающимися на
.jpg
, в каталогах
image/cars
, image/space0
,
(...), image/space9
, если такие
каталоги существуют.
/usr/share/doc/*/README
: все файлы с
именами README
во всех
подкаталогах, следующих непосредственно
после /usr/share/doc
. Одним из
совпадений, например, будет
/usr/share/doc/mandriva/README
, но не
/usr/share/doc/myprog/doc/README
.
*[!a-z]
: все файлы в текущем
каталоге с именами, которые
не оканчиваются буквой в
нижнем регистре.
[14]
Будьте
осторожны! Хотя это справедливо для
большинства языков, это может быть не так
в вашей собственной настройке языка
(локали
). Это зависит от
порядка сортировки. В
некоторых языковых настройках
[a-z]
будет соответствовать a, A,
b, B, (...), z. Не говоря уже о том, что
некоторые языки имеют подчеркнутые
символы...