Ключевое свойство большинства
оболочек Unix - это способность ссылаться сразу более, чем на один файл, используя
для этого специальные символы. Эти, так называемые "дикие карты" (wildcards),
позволяют ссылаться, скажем, на все файлы, содержащие символ "n".
Уайлдкард ``*'' относится
к любому символу или строке символов в имени файла. Например, когда вы используете
символ ``*'' в имени файла shell заменяет ее всеми возможными именами
файлов из каталога, на который вы ссылаетесь. Вот простенький пример. Предположим,
что Larry имеет файлы 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#
Процесс замены ``*''
на имена файлов называется расширением уайлдкард и выполняется shell. Это важно:
конкретные команды, вроде ls, никогда не видят ``*''
в своем списке параметров. Shell, расширяя уайлдкард, включает в список параметров
все имена, прошедшие сравнение с шаблоном. Так что команда
/home/larry# ls *o*
расширяется shell до фактической
/home/larry# ls frog joe
Одно важное замечание относительно
``*'' уайлдкард. Использование этой уайлдкард не даст совпадения
с именами файлов, которые начинаются с точки (``.''). Эти файлы
воспринимаются как "спрятанные", хотя на самом деле их никуда не прятали. Они
не показываются в списке, выдаваемом нормальной командой ls и не
выбираются при использовании ``*'' уайлдкард.
Вот пример. Мы уже упоминали,
что каждый каталог имеет два специальных файла: ``.'' - указание
на текущий каталог и ``..'' - указание на родительский каталог. Однако, если
вы используете команду ls, эти два файла не будут отображены.
/home/larry# ls
frog joe stuff
/home/larry#
Если вы используете опцию
-a в команде ls, то вы сможете отобразить имена, начинающиеся
на ``.'':
/home/larry# ls -a
. .. .bash_profile .bashrc frog joe
stuff
/home/larry#
Как видим, два специальных
файла ``.'' и ``..'', также, как два других "спрятанных"
файла - .bash_profile и .bashrc. Эти два файла используются
при входе larry в систему. Более подробно о них в Разделе 3.13.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.4
мы говорили, что команды cp и mv могут копировать
или перемещать множества файлов за один раз. Например,
/home/larry# cp /etc/s* /home/larry
скопирует все файлы в /etc
, начиная с ``s''в каталог /home/larry. Формат команды cp
на самом деле
cp <file1> ... <fileN> <destination>
где <file1>
... <fileN> - список копируемых файлов, а <destination>
это файл или каталог, в который производится копирование. mv имеет аналогичный
синтаксис.
Обратите внимание, что если
производится копирование или перемещение более, чем одного файла, <destination>
должен быть каталогом. В файл скопировать или переместить можно только один
файл.