Шаблон "*" обозначает любой символ или строку символов в имени файла. Когда в имени файла используется символ "*", командная оболочка заменяет его на всевозможные варианты, которые встречается в именах файлов в рассматриваемом каталоге.
Приведем простой пример. Допустим, у пользователя Лэрри в текущем каталоге имеются файлы frog, joe и stuff.
/home/larry# ls frog joe stuff /home/larry\#Для того, чтобы обратиться ко всем файлам, в имени которых содержится символ "o", надо использовать команду
/home/larry# ls *o* frog joe /home/larry#Можно видеть, что всякий раз, когда в имени встречается символ "*", он заменяется всеми возможными вариантами, которые встречаются в именах файлов в текущем каталоге.
Шаблон, состоящий из единственного символа "*", подходит ко всем именам файлов, поскольку этому шаблону подходят все последовательности символов. Пример:
/home/larry# ls * frog joe stuff /home/larry#Приведем еще несколько примеров:
/home/larry# ls f* frog /home/larry# ls *ff stuff /home/larry# ls *f* frog stuff /home/larry# ls s*f stuff /home/larry\#Процесс замены символа "*" на последовательность имен файлов называется расширением шаблона (wildcard expansion). Расширение шаблона производится командной оболочкой. Очень важно знать, что отдельная команда, такая как ls, никогда не "видит" символ "*" в списках своих параметров. Именно командная оболочка производит расширение шаблона таким образом, что будут перечислены все удовлетворяющие шаблону имена файлов. Таким образом, команда
/home/larry# ls *o*расширяется командной оболочкой в команду
/home/larry# ls frog joeСделаем важное замечание о шаблоне "*": он не распознает имена файлов, которые начинаются с одной точки ("."). Эти файлы рассматриваются как скрытые (hidden). Скрытость этих файлов заключается в том, что они не включаются в список, выдаваемый обычными командами ls, и не распознаются шаблонами, содержащими символ "*".
Приведем пример. Раньше мы говорили, что в каждом каталоге есть два специальных элемента: элемент "." обозначает текущий каталог, а элемент ".." обозначает родительский каталог. Однако, при использовании команды ls эти два элемента в списке не появляются:
/home/larry# ls frog joe stuff /home/larry\#Однако, если с командой ls использовать опцию -a, то имена файлов, начинающихся с символа ".", окажутся в списке. Попробуем эту опцию:
/home/larry\# ls -a . .. .bash_profile .bashrc frog joe stuff /home/larry\#Этот список содержит два специальных элемента: "." и "..", а также два других "скрытых" файла: .bash_profile и .bashrc. Эти два файла являются файлами начальной конфигурации для командной оболочки bash и читаются при входе пользователя larry в систему. Описание этих файлов дано в разд. 3.14.3.
Заметим, что когда мы использовали шаблон "*", в списке не появилось ни одного файла, имя которого начиналось с символа ".".
/home/larry# ls * frog joe stuff /home/larry#Это предусмотрено механизмом безопасности: если бы шаблон "*" подходил бы и к именам файлов, начинающихся символом ".", он бы также подходил и к именам каталогов "." и "..". Это было бы опасно при использовании некоторых команд.
Еще одним специальным символом в шаблонах является символ "?". Шаблон "?" расширяется до ровно одного символа. Таким образом, команда "ls ?" выведет список всех файлов, имена которых состоят из одного символа. Команда "ls termca?" включит в список файл "termcap", но не включит файл "termcap.backup". Приведем еще один пример:
/home/larry# ls j?e joe /home/larry# ls f??g frog /home/larry\# ls ????f stuff /home/larry#Как мы видим, шаблоны позволяют обращаться сразу к нескольким файлам. В разд. 3.5, в котором дается краткое описание команд, говорилось, что команды cp и mv в действительности могут копировать или переносить больше одного файла за один раз. Например, команда
/home/larry\# \tinput{cp /etc/s\ttstar /home/larry}копирует все файлы в каталоге /etc, имя которых начинается с символа "s", в каталог /home/larry. В действительности, формат команды cp является следующим:
cp \cparam{files} \cparam{destination}где files -- список имен файлов, которые надо копировать, а destination -- файл или каталог, куда надо копировать. Команда mv имеет аналогичный синтаксис.
При копировании или переносе более чем одного файла аргумент destination должен быть именем каталога. Только ровно один файл может быть скопирован или перенесен в другой файл.