Когда интерпретатор shell встречает указанные символы в командной строке, он обрабатывает их особым образом, если только вы не защитили их с помощью кавычек, о чем говорится в главе 15.
4.1. Применение метасимвола '*'
Символ звездочки может служить заменой любой части имени файла. Следующая команда выводит список всех файлов, имена которых начинаются со строки "app":
$ ls app*
appdva app_tapes
appdva_SLA
Вот как можно получить список файлов, имеющих расширение doc:
$ ls *.doc
accounts.doc qtr_end.doc
Представленная ниже команда находит файлы, у которых имя начинается со строки "cl", а расширение равно sed:
$ ls cl*.sed
cleanlogs.sed cleanmeup.sed
cleanmessages.sed
Звездочку удобно применять, когда, например, не хочется вводить полное имя каталога при переходе в него:
$ cd /etc
$ ls -l | grep ^d
drwxr‑xr‑x 2 root root 1024 Jan 26 14:41 cron.daily
drwxr‑xr‑x 2 root root 1024 Jan 27 1998 cron.hourly
drwxr‑xr‑x 2 root root 1024 Jan 27 1998 cron.monthly
drwxr‑xr‑x 2 root root 1024 Jan 26 14:37 cron.weekly
$ cd cron.w* S pwd
/etc/cron.weekly
4.2. Применение метасимвола '?'
Знак вопроса служит для замены любого отдельного символа. Следующая команда выводит список файлов, имена которых содержат не менее трех символов, причем третьим является символ 'R':
$ ls ??R*
BAREAD
Следующая команда ищет файлы с именами, начинающимися со строки "conf", за которой следуют два произвольных символа и расширение log:
$ ls conf??.log .
confl2.log conf.2.log
conf25.log
Вот как можно найти файлы, имена которых состоят не менее чем из четырех символов, причем первым является символ 'f', а последним — 's':
$ ls f??*s
ftpaccess ftphosts ftpconversions ftpusers ftpgroups
4.3. Применение метасимволов […] и [!…]
Метасимволы [… ] соответствуют любому символу из числа тех, что указаны в квадратных скобках. Представленная ниже команда выводит список файлов, имена которых начинаются с символа 'i' или 'o':
$ ls [io]*
inetd.conf ioctl.save outputrc
info‑dir inputrc
initrunlvl issue
inittab issue.net
В скобках можно задавать диапазон символов. Начальный и конечный символы при этом разделяются дефисом. Например, следующая команда ищет файлы с именем log, в расширении которых первый символ — цифра:
$ ls log.[0-9]*
log.0323 log.0325 log.0324 log.0326
Метасимволы [!…] соответствуют любому символу из числа тех, что не указаны
в квадратных скобках. Если в предыдущем примере на первом месте в скобках поставить восклицательный знак, команда будет искать файлы с именами log, в расширении которых первый символ не является цифрой: '
$ ls log.[!0-9]*
log.sybase
Приведенная ниже команда ищет файлы, имена которых начинаются со строки "LPS", два следующих символа могут быть произвольными, затем идет символ, не являющийся цифрой, а за ним — произвольная строка:
$ ls LPS??[!0-9]*
LPSILP LPSOSI LPSOPS LPSPOPQTR
Поиск файлов, имена которых начинаются с символа верхнего регистра, производится посредством такой команды:
$ ls [A‑Z]*
Следующая команда ищет файлы, имена которых, наоборот, начинаются с символа нижнего регистра:
$ 1а [а–z]*
А эта команда находит файлы, в начале имени которых стоит цифра:
$ ls [0-9]*
Вот как можно найти все скрытые файлы (такие как .profile, .rhosts, .history и т. д.):
$ ls .*
4.4. Заключение
Метасимволы представляют собой универсальный инструмент поиска строк по шаблону. С их помощью легко находить нужные файлы и каталоги. Далее мы более подробно рассмотрим способы применения метасимволов в составе регулярных выражений.
Ввод и вывод данных в интерпретаторе shell
Команды и сценарии могут получать входные данные двумя способами: из стандартного входного потока (связан с клавиатурой) или из файла. Аналогичное разделение существует и при выводе данных: результаты работы команды или сценария по умолчанию направляются на экран терминала, но можно перенаправить их в файл. Если в процессе работы возникают ошибки, сообщения о них тоже отображаются на экране. Чтобы избежать этого, нужно перенаправить поток ошибок в файл.
В этой главе рассматриваются следующие темы:
• работа со стандартными потоками ввода, вывода и ошибок;
• переадресация ввода и вывода.
5.1. Команда echo