Возможно, вы уже использовали символы подстановки, не зная как это называется и что это такое. Когда вы выбираете файл в Windows или когда вы ищете файл, вы используете * для соответствия случайной строке. Например, *.txt соответствует всем файлам с окончаниями .txt в именах. Мы тоже интенсивно использовали их в последнем разделе. Но существует гораздо больше подстановок, чем только *.
Когда вы набираете команду типа ls *.txt и нажимаете Return (ввод), задача поиска файлов, совпадающих с критерием *.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] Осторожно! Если это работает GNU/Linux, то вполне может не работать под другими UNIX-подобными операционными системами. Это зависит от сопоставления порядка (collating order). На некоторых системах [a-z] будет соответствовать a, A, b, B, (...), z. Не говоря уже о том, что некоторые языки имеют подчеркнутые символы...