Шаблоны Подстановки Shell

Возможно, вы уже использовали символы подстановки, не зная как это называется и что это такое. Когда вы выбираете файл в 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. Не говоря уже о том, что некоторые языки имеют подчеркнутые символы...



Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости