Вы, вероятно, уже использовали символы
подстановки,
не зная, что это такое. Если вы указываете файл в 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]
,
например, будет соответствовать любому символу, который не является буквой в
нижнем регистре[5];
{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/mandrake/README
, но не
/usr/share/doc/myprog/doc/README
.
*[!a-z]
: все файлы в текущем каталоге с именами,
которые не оканчиваются буквой в нижнем регистре.
[5]
Будьте осторожны! Хотя это справедливо для большинства языков,
это может быть не так в вашей собственной настройке языка
(локали
). Это зависит от порядка
сортировки. В некоторых языковых настройках
[a-z]
будет соответствовать a, A, b, B, (...), z.
Не говоря уже о том, что некоторые языки имеют подчеркнутые символы..