Ключевой момент состоит в том, что способ сокращения имени файла — это не свойство программы pr
, а возможность, реализуемая интерпретатором shell
. Поэтому вы можете использовать ее для создания последовательности имен файлов в любой команде, например для подсчета числа слов первой главы:
$ wc ch1.*
113 562 3200 ch1.0
935 4081 22435 ch1.1
974 4191 22756 ch1.2
378 1561 8481 ch1.3
1293 5298 28841 ch1.4
33 194 1190 ch1.5
75 323 2030 ch1.6
3801 16210 88930 total
$
Существует программа с именем echo
("эхо"), которая особенно ценна для экспериментов со "смыслом" сокращенных имен. Как вы смогли догадаться, echo
лишь повторяет свои аргументы.
$ echo hello world
hello world
$
Но аргументы могут формироваться путем выбора по шаблону. Так, команда
$ echo ch1.*
перечисляет имена всех файлов в гл. 1,
$ echo *
перечисляет имена всех файлов текущего каталога в алфавитном порядке,
$ pr *
выводит на печать содержимое всех ваших файлов (в алфавитном порядке), а
$ rm *
удаляет все файлы текущего каталога. (Лучше быть абсолютно уверенным, что вы действительно этого хотите!)
Символ *
может встречаться не только в конце имени файла. Его можно использовать всюду и даже по нескольку раз. Поэтому
$ rm *.save
удалит все файлы, оканчивающиеся на .save
.
Заметьте, что все имена файлов выбираются в алфавитном порядке, который отличается от числового. Если в вашей книге 10 глав, порядок может быть не тем, на который вы рассчитываете, поскольку ch10
идет перед ch2
:
$ echo *
ch1.1 ch1.2 ... ch10.1 ch10.2 ... ch2.1 ch2.2 ...
Символ *
— не единственный способ задания шаблона для интерпретатора shell
, хотя и наиболее часто используемый. Шаблон [...]
задает любые символы из перечисленных внутри скобок. Несколько подряд следующих букв или цифр можно задать в сокращенном виде:
$ pr ch[12346789]*
Печать глав 1,2,3,4,6,7,8,9, но не 5
$ pr ch[1-46-9]*
То же самое
$ rm temp[a-z]
Удалить все tempa, …, tempz
Шаблон ?
задает любой одиночный символ:
$ ls ?
Список файлов с именем из одного символа
$ ls -l ch?.1
Список ch1.1 ch2.1 ch3.1 и т.д., но не ch10.1
$ rm temp?
Удалить все файлы temp1, …, tempa и т.д.
Отметим, что шаблоны сопоставляются только с именами существующих файлов. В частности, нельзя создать новые имена файлов с помощью шаблонов. Например, если вы захотите расширить ch
до chapter
в каждом имени файла, то такой вариант вам не поможет:
$ mv ch.* chapter.*
Не работает!
поскольку chapter.*
не соответствует ни одному из существующих имен файлов.
Символы шаблонов, подобные *
, могут использоваться в абсолютных именах наравне с обычными именами файлов; сопоставление происходит для каждого компонента абсолютного имени, содержащего специальный символ. Так, /usr/mary/*
инициирует поиск файлов в /usr/mary/
, a /usr/*/calendar
порождает список абсолютных имен всех пользователей, работающих с каталогом calendar
.
Если вам когда-нибудь придется отказаться от специального назначения символов *
, ?
и др., заключите весь аргумент в апострофы, например:
$ ls '?'
Можно также предварить специальный символ обратной дробной чертой:
$ ls \?
(Вспомните, что, поскольку ?
не является символом стирания или уничтожения, обратная дробная черта перед ним будет обрабатываться не ядром, а интерпретатором shell
.) Использование кавычек подробно рассматривается в гл. 3.
Упражнение 1.4
В чем состоит различие между следующими командами:
$ ls junk $ echo junk
$ ls / $ echo /
$ ls $ echo
$ ls * $ echo *
$ ls '*' $ echo '*'
Переключение ввода-вывода
Большинство команд, которые мы рассматривали, производят вывод на терминал, некоторые из них, подобно редактору, осуществляют ввод с терминала. А теперь приведем почти универсальное правило: терминал может быть заменен для ввода, вывода или обеих операций на файл.
Например,
$ ls
выдает список файлов на ваш терминал. Но если задать
$ ls > filelist
то тот же список файлов помещается вместо этого в файл filelist
. Символ >
означает, что выходной поток должен быть помещен в указанный далее файл, а не выведен на терминал. Файл будет создан, если он ранее не существовал, или будет заменено содержимое старого. На своем терминале вы ничего не получите. В качестве другого примера можно слить несколько файлов, "перехватив" выходной поток команды cat
и направив его в файл:
Читать дальше
Конец ознакомительного отрывка
Купить книгу