Шаблоны имён файлов


Важное свойство большинства командных оболочек системы Linux — способность обращаться к более, чем одному файлу по имени с использованием специальных символов — шаблонов. С помощью этих шаблонов (wildcards) можно обращаться ко всем файлам, имена которых содержат, скажем, символ n.

═ Шаблон * обозначает любой символ или строку символов в имени файла. Когда в имени файла используется символ *, командная оболочка заменяет его на всевозможные варианты, которые встречается в именах файлов в рассматриваемом каталоге.

Приведём простой пример. Допустим, у пользователя Ларри в текущем каталоге имеются файлы 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 в систему.

Заметим, что когда мы использовали шаблон *, в списке не появилось ни одного файла, имя которого начиналось с символа ..

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