nextuppreviouscontents
Next:Стыкование команд в системе Up:Учебник по системе LinuxPrevious:Типы командных оболочек

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

  Важное свойство большинства командных оболочек системы 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 в систему. Описание этих файлов дано в разд. 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 должен быть именем каталога. Только ровно один файл может быть скопирован или перенесен в другой файл.


nextuppreviouscontents
Next:Стыкование команд в системе Up:Учебник по системе LinuxPrevious:Типы командных оболочек
root

Sun Aug 29 12:01:30 MSD 1999