Страница:
поставления, используя ключ -e. Напомним, что выражение должно соот-
ветствовать синтаксису команды grep. Если вы хотите освежить свою па-
мять, посмотрите grep(1) в руководстве по AT&T UNIX или grep(C) в руко-
водстве по XENIX. Для получения полной информации о синтаксисе посмот-
рите ed(1). Этот синтаксис является основой большинства команд, работа-
ющих с регулярными выражениями, таких как sed и grep.
Например, если вы используете выражение "*test*", выражение для
grep должно иметь вид ".*test.*". Его можно слегка изменить в зависи-
мости от того, что вы желаете иметь с каждой стороны цепочки test. В
данном случае синтаксис указывает все символы (.*), за которыми следует
цепочка t-e-s-t, а затем любая цепочка символов (.*). В этом случае
ключ имел бы вид "-e.\*test.\*". Это кажется немного странным, но это
соответствует синтаксису. (Двойные кавычки не являются частью команды.)
Символ обратной косой черты (\) используется для экранирования звездоч-
ка. Если вы не экранируете ее, командный процессор соотнесет ее с име-
нами всех файлов вашего текущего каталога, чего вы не желаете. Экрани-
рование ее позволит, чтобы нужный символ был передан dosflp, для
использования ее в grep-последовательности.
Ключ -h - это еще один из ключей прямого указания. Давайте вкратце
рассмотрим его синтаксис внутри dosflp. Это ".*\.h$", и он указывает
любой символ, за которым стоит одно или несколько вхождений любого сим-
вола (.*), литеральная точка (.\), символа h и вслед за ним конец стро-
ки (h$). Вы могли бы указать то же самое, используя ключ -e, но -h де-
лает это гораздо легче.
Ключ -l изменяет основное действие команды dosflp. Вместо копиро-
вания файлов он выдает список файлов. Это делается путем выполнения
различных команд вида dosxx, в данном случае dosdir. Ключ выдачи списка
полезен в dosflp, потому что вы можете получить список как информацию к
решению о том, что делать дальше, и вам нет необходимости помнить ко-
манду dosdir.
Ключ -r также изменяет основную операцию команды dosflp. В этом
случае файлы удаляются, а не копируются. Если вы указали этот ключ, вы-
дается сообщение, которое просит вас подтвердить, что вы хотите удалить
указанные файлы. Вы можете просто ответить "n", и запретить удаление,
если вы ввели этот опцию случайно. Напомним, что удаленные файлы или
файлы, включенные в список (в случае ключа -l), выбраны выражением
grep, которое жестко запрограммировано или указано пользователем. По
умолчанию выбираются ВСЕ файлы. Для ключа -r это соответствует тому,
что сказать "rm *".
Последний ключ, -s, обеспечивает возможность доступа к файлам, ко-
торые размещены внутри подкаталога на гибком диске DOS. Если вы обраща-
етесь только к имени устройства, по умолчанию ключ -s относится к ката-
логу самого верхнего уровня на гибком диске. Если нужный вам файл нахо-
дится в подкаталоге, вы должны использовать определенную нотацию, чтобы
попасть в него. Одно из различий между XENIX и DOS заключается в симво-
ле, используемом для разделения элементов маршрутного имени. XENIX
использует обычную запись в стиле UNIX - /x/y/z. В DOS применяется сим-
вол "обратная косая черта", т.е. \x\y\z. Но если вы хотите использовать
команды XENIX на гибком диске DOS, вы должны применять обычную запись
XENIX, a:/x/y/z. Это не совсем понятно, но правильно.
По умолчанию, dosflp копирует файлы с гибкого диска в
ваш текущий каталог на жестком диске. Если вы измените операцию на
выдачу списка или удаление, эта операция будет произведена на гибком
диске.
Примеры
1. $ dosflp -dB: -c -l
Выдает список всех файлов вида *.c на гибком диске DOS, размещен-
ном в устройстве B. В этом случае не происходит переход вниз в подката-
логи, а включаются лишь файлы, размещенные на верхнем уровне каталогов.
2. $ cd /destdir
$ dosflp -ssrc -e.\*src.\*
Переход в каталог, куда будут помещены файлы. Копируются файлы с
гибкого диска DOS (устройство A, подкаталог src), в текущий каталог.
Файлы для копирования указаны как *src*. В записи UNIX это выглядело бы
так: "cp A:/src/*src* .".
3. $ dosflp -r -stmp
Удаляет все файлы, размещенные в подкаталоге tmp на гибком диске
DOS (устройство A). Обратите внимание, что сам каталог не удаляется. В
записи UNIX это выглядело бы так: "rm A:/tmp/*".
4. $ sh -x `path dosflp` -dB:
Запускает процедуру dosflp в отладочном режиме выполнения.
Единственное ограничение при таком вызове командного процессора заклю-
чается в том, что файл данных, который вы посылаете ему (в данном слу-
чае dosflp), должен иметь полное маршрутное имя. Поскольку командный
процессор НЕ выполняет поиск маршрутного имени файла, нам необходимо
сперва найти маршрутное имя dosflp, затем передать его командному про-
цессору, запущенному в отладочном режиме выполнения, а также передать
процедуре dosflp аргумент в командной строке. Заметьте, что вызов
dosflp таким путем не меняет значение переменной $#, которое только
распознает ключ -dB: как аргумент.
Пояснения
Строки 4-6 выполняют инициализацию по умолчанию путем сохранения
значений в соответствующих переменных командного процессора. По умолча-
нию символ-шаблон ставится в соответствие всем файлам, указанным выра-
жением для команды grep .\*. Обратная косая черта требуется для экрани-
рования звездочки, поэтому она не перехватывается командным процессо-
ром. Устройство по умолчанию - A:. Операция по умолчанию - копировать
файлы, что указано значением "c" для переменной опции.
В строках 8-25 устанавливаются значения ключей и производится про-
верка на наличие ошибок. Если командная строка имеет некоторые аргумен-
ты ($# -gt 0), мы перебираем каждый аргумент и проверяем его. Если най-
ден допустимый ключ, переменные устанавливаются согласно ключу. Если
обнаружен недопустимый ключ, выдается сообщение об ошибке и программа
завершается с плохим статусом возврата.
Имеется два важных типа ключей. Ключи, которые выполняют прямое
указание типа файла, просто устанавливают переменную EXP в соответствии
с ключом. Аналогично, ключи, которые определяют, какой вид работы будет
выполняться процедурой, просто устанавливают соответствующую переменную
OP. Другие ключи должны обрабатываться путем извлечения одного или
нескольких символов из командной строки, которые следуют за флагом клю-
ча, эхо-отображения и конвейерной пересылки текущего аргумента ARG ко-
манде cut для извлечения символа (символов), начинающихся с третьего
символа аргумента, затем присвоения результата этой операции соот-
ветствующей переменной.
Из всего сделанного следует вывод, что пробелы между ключами и
символами, которые стоят за ними, не допускаются. Например, ключ -d
должен получить имя устройства. По синтаксису должно быть -dB:, но не
-d B:, потому что B: интерпретировалось бы как другой аргумент ARG в
цикле for, а это все испортит.
В строках 27-39 операция, которая должна быть выполнена, определя-
ется при помощи следующего оператора case. Если должно быть выполнено
копирование, выдается сообщение "copying" и выполняется то, что следует
за оператором case. Если должен быть выдан список файлов, выдается
сообщение об устройстве, содержимое которого должно распечататься, за-
тем выдается список файлов путем выполнения команды dosdir и конвейер-
ной пересылки результата команде more, после чего dosflp завершается.
Если файлы должны быть удалены, пользователю выдается запрос на
подтверждение удаления. Если ответ "yes", выдается сообщение, с какого
устройства файлы будут удалены. Если ответ "no", dosflp завершается.
Остаток командного файла имеет дело с механизмом копирования.
Строка 41 - это первый шаг в наведении моста над пропастью между двумя
типами носителей. Команда dosls использована для получения полного
списка файлов с гибкого диска. Перед тем как мы передадим этот список
во временный файл, мы пропустим его через команду tr (translate), кото-
рая преобразует все символы на нижний регистр, чтобы при копировании
файлов их имена были в нижнем регистре. В результате копии будут поме-
щены на диск XENIX с именами файлов в нижнем регистре. Если у вас есть
файлы с именами в верхнем регистре или в смеси регистров, вы должны
вручную исправить их после копирования.
Строки 43-50 выполняют само копирование. Цикл for запускается для
доступа к каждому файлу индивидуально. Это требование команд вида
dosxx. Вы должны получать доступ к одному файлу один раз, поскольку
этот уровень не обладает возможностью указания символа-шаблона. Имена
файлов, которые использует цикл for, определены путем использования ко-
манды grep для выбора имен соответственно выражению, установленному ра-
нее.
Имя каждого выбранного файла сначала отображается, так что пользо-
ватель может видеть, выполняется ли команда так, как ожидалось. В этом
месте мы можем сделать одну из двух вещей: или копировать файлы, или
удалить их. Эта операция определяется оператором case в строках 46-49.
Если операция - копирование файлов, файлы копируются из комбинации уст-
ройство-файл в текущий каталог. Обратите внимание, что в переменную
DRIVE включается подкаталог, если он был указан в командной строке. Это
объясняет наличие символа "/" в конце присвоения значения переменной
DRIVE в строке 16. Полное выражение должно быть таким: B:/subdir/file.
Если операция - удаление файлов, комбинация устройство/файл удаляется
выполнением команды dosrm. Попутно заметим, что маршрутное имя есть
нечто гибкое (или небрежное, в зависимости от того, как вы смотрите на
него) в том смысле, что вы можете сказать A:/subdir или A:subdir. Оба
варианта правильны. После того как все файлы будут обработаны, времен-
ный файл удаляется.
Одно из мест, где вы можете настраивать dosflp, это регулярные вы-
ражения. Уже включены выражения для .asm, .c и .h, но вы можете изме-
нить это или добавить больше ключей для любой последовательности, кото-
рую вы часто используете.
3.3. Средства получения резервных копий
3.3.1. autobkp - автоматичеески наращивамый файл резервной копии
---------------------------------------------------------------------
Имя: autobkp
_____________________________________________________________________
autobkp Автоматически наращиваемый файл резервной копии
Производит поиск по дереву файлов, которые изменялись за последние
24 часа, и пересылает их в другую систему (посредством uucp) или пере-
мещает их в другую область жесткого диска.
autobkp [-c] [>logfile]
-c копирует файлы в другое место диска вместо
использования uucp
Пример вызова
autobkp < filelist >> bkplog
Копирует все файлы, указанные в filelist,
и записывает имена файлов в файл с именем bkplog
Командный файл autobkp
1 :
2 # @(#) autobkp v1.0 Automatic file backup Author: Russ Sage
4 if [ $# -gt 1 ]
5 then echo "autobkp: argument error" >&2
6 echo "usage: autobkp [-c] [>logfile]" >&2
7 exit
8 fi
10 if [ "$1" = "-c" ]
11 then COPY=on
12 else COPY=off
13 fi
15 echo "\nBACKUP DATE `date '+%a %m/%d/%y %H:%M:%S'`"
16 echo "-----------------------------------------"
18 SYSTEM='' # destination system uucp node name
19 : ${SYSTEM:=`uuname -l`}
21 echo "Sourse system:\t\t`uuname -l`\nDestination system:\t$SYSTEM"
23 while read SRCDIR DESTDIR FILES
24 do
25 if [ ! -d $SRCDIR ]
26 then echo "autobkp: $SRCDIR is not a directory"
27 continue
28 fi
30 cd $SRCDIR
31 echo "\nFinding files in: $SRCDIR"
33 for FILE in `find . -type f -ctime 0 -name "$FILES" -print`
34 do
35 case $COPY in
36 off) uucp $FILE $SYSTEM!$DESTDIR;;
37 on) cp $FILE $DESTDIR;;
38 esac
39 echo " Transferred $FILE to $DESTDIR"
40 done
41 done
Переменные среды выполнения
COPY Флаг, определяющий, используется команда uucp или cp
FILE Имя каждого файла, найденного в исходном списке маршрутов
FILES Символ-шаблон, указывающий, какие файлы определены
PATH1 Имя маршрута-источника
PATH2 Имя маршрута-приемника
SYSTEM Имя системы-приемника для uucp
Описание
Зачем нам нужен autobkp?
Как мы заметили, файлы в UNIX плодятся как кролики. Чем больше
файлов мы создаем, тем сильнее желание сохранять их упорядоченными. До-
вольно легко стать ленивым или получить ложное представление о безо-
пасности и пренебречь регулярным копированием.
Вы можете подходить к копированию файлов несколькими путями. Наи-
более популярной стратегией является выполнение наращиваемого копирова-
ния, когда вся система копируется с некоторой начальной даты (и иногда
повторно с регулярными интервалами, но не часто). При коротких интерва-
лах (обычно ежедневно) файловая система проверяется на наличие файлов,
которые были модифицированы или добавлены за последние 24 часа. Такие
файлы копируются, поэтому копия в целом поддерживается такой, какой яв-
ляется система в настоящее время.
Где размещать копируемые файлы - это еще один интересный вопрос,
зависящий от конфигурации вашей системы, количества доступного прост-
ранства и важности данных. Давайте рассмотрим некоторые возможности.
Автономная микро- или супермикросистема может иметь всего один
жесткий диск. Если диск содержит достаточно места для размещения друго-
го раздела, вы можете копировать в этот раздел. Раздел может также
использоваться как неструктурированное устройство в отличие от файловой
системы и рассматриваться как магнитная лента или гибкий диск. Среди
других возможностей хранения информации могут быть второй жесткий диск,
кассетная лента или устройство копирования на ленту. Если вам недоступ-
на ни одна из этих возможностей, вы всегда можете копировать на гибкие
диски. Это утомительная ручная работа, но она может быть выполнена при
помощи команд tar или cpio.
Если вы также имеете доступ к другой, большей системе, такой как
общий главный компьютер, вы можете копировать файлы, посылая их в эту
систему посредством команды uucp. Даже если вы имеете достаточно места
в вашей собственной системе для сохранения ваших копий, у вас может
быть очень сильное желание послать копии всех важных файлов в главную
машину, потому что это даст вам выносную копию за пределами вашего
места расположения. Пожары, наводнения и др
ются.
Нам необходим механизм, который обычно запускается автоматически
(по команде cron или с помощью процедуры at, описанной в главе 5). Сна-
чала он обнаруживает все файлы, которые были изменены в последние 24
часа (надеемся, что вы уже имеете первоначальную копию всего). Он начи-
нает искать файлы из указанных каталогов и копировать подходящие файлы
в указанные каталоги-приемники. Он копирует файлы, используя утилиты,
которые наилучшим образом соответствуют используемой вами конфигурации.
Все эти вещи выполняются нашим командным файлом autobkp.
Что делает autobkp?
Вы перечисляете маршруты и autobkp находит файлы по этим маршрутам
и копирует их в то место, которое вы указали. Вы можете указывать имена
файлов по образцам, таким как *.c, *.h или каким-либо еще. С помощью
autobkp вы можете копировать важные файлы без копирования всех файлов.
Иногда это удобно - пропускать файлы при копировании. Типичные файлы,
которые вы, возможно, не хотите копировать, - это очень большие файлы
(не являющиеся важными, как файл core и файлы данных), временные файлы
(как *.o, которые вновь создаются при каждой новой компиляции) и испол-
няемые файлы, если у вас есть исходные программы на языке Си и вы може-
те их скомпилировать для получения новых исполняемых файлов. Пропуская
эти файлы, вы можете уменьшить размер ваших копий на мегабайты.
По умолчанию копирование производится командой uucp, которая пред-
полагает, что у вас подчиненная система по отношению к главной машине и
копирует ваши файлы в большую систему. Если вы хотите копировать ваши
файлы в другое место жесткого диска или на другой жесткий диск, исполь-
зуйте ключ -c для копирования командой cp вместо использования команды
uucp.
Во время процесса копирования на стандартный вывод выводятся сооб-
щения о состоянии дел. Это позволяет легко собрать все сообщения путем
переадресации stdout на время копирования. Если вы выполняете autobkp
вручную, сообщения выводятся на экран. Первое сообщение - это заголо-
вок, который печатает день, дату и время. Это выглядит так:
--------------------------
| BACKUP DATE Fri 05/23/86 17:33:35
|
Второе сообщение определяет систему-источник и систему-приемник.
Оно появляется ниже. В нашем примере система-источник - russ, а систе-
ма-приемник - vax.
--------------------------
| Source system: russ
| Destination system: vax
При каждом входе в систему-источник выдается следующее сообщение:
-----------------------------
| Finding files in: src_dir
|
где выражение src_dir - это место, откуда файлы будут переданы в
цикл копирования. Обратите внимание, что первое имя должно быть именем
каталога, потому что autobkp начинает именно с этого места поиск фай-
лов. Если первое имя не является каталогом, программа печатает сообще-
ние об ошибке и продолжает работу со следующим набором источник/прием-
ник для копирования.
Для каждого найденного файла печатается следующее сообщение после
завершения копирования:
------------------------------
| Transferred file to dest_dir
|
которое указывает, что файл file был скопирован в каталог-приемник
с именем dest_dir.
Файл со списком маршрутов
Чтобы сделать интерфейс настолько гибким, насколько это возможно,
autobkp читает стандартный ввод. Переназначая stdin, вы можете поддер-
живать разные списки файлов, которые необходимо копировать и переклю-
чать их в командной строке. Вы можете иметь один список маршрутов для
системных файлов, другой для исходных файлов, третий для личных файлов,
четвертый для файлов с готовым продуктом и так далее. Для каждой из
этих групп файлов создается список маршрутов и передается в качестве
входа для autobkp. Входные данные читаются как три поля: FROM, TO и
TYPE. Поле FROM - это каталог-источник. Поиск файлов начинается с этого
места. Напомним, что autobkp проходит вниз до конца дерева файлов, на-
чиная с указанного каталога.
Поле TO - это каталог-приемник, куда все файлы, найденные для дан-
ной записи в файле со списком маршрутов, помещаются на машине-приемнике
или в разделе-приемнике.
Поле TYPE - это описатель-шаблон, который сообщает autobkp, какие
файлы искать. Его значение может быть *, *.c, *src*, и так далее. Как
мы увидим позже, этот описатель передается команде find Unix, которая
фактически и выполняет поиск файлов. Вы можете использовать любое выра-
жение в поле TYPE, если оно соответствует синтаксису find.
Итак: все файлы, которые были изменены в последние 24 часа, обна-
руживаются в списке FROM с помощью описателя TYPE и копируются в об-
ласть TO.
Ниже приводится типичный файл со списком маршрутов. Он указывает
несколько каталогов, в которых производится поиск файлов. Обратите вни-
мание, что эти каталоги находятся под регистрационным каталогом: если
вы хотите скопировать ВЕСЬ регистрационный каталог полностью, вы можете
указать этот каталог, но здесь мы хотим выбрать только указанные ката-
логи.
/usr/russ/bin /pack1/russ/.bkp/bin *
/usr/russ/doc /pack1/russ/.bkp/doc *
/usr/russ/src /pack1/russ/.bkp/src *.c
/usr/product1 /pack1/russ/.bkp/product1 *.[ch]
Эти строки копируют каталоги bin, doc и src на локальной машине
автора. В случае каталога src мы указали, что копировать нужно только
исходные файлы на языке Си. Будет также скопирована некоторая полезная
информация из другого места этой же системы. Будут скопированы только
файлы с расширением *.c и *.h.
Место назначения (прямо указанное в командном файле автоматическо-
го копирования) - другая система UNIX. Место назначения - некоторый
смонтированный диск, регистрационный каталог, подкаталог копий (bkp).
Использование cron
Теперь, когда процедура autobkp знает, что искать, давайте скажем
ей, когда искать. Cron, вечный резидентный хранитель времени, может
легко выполнить эту работу. Входные данные для cron обычно устанавлива-
ются системным администратором (или кем-либо, кто имеет права записи в
/usr/lib/crontab), так что вы должны попросить администратора устано-
вить для вас вход в файл данных cron. Для получения дополнительной ин-
формации о входных данных cron, прочтите cron(1M) в Руководстве адми-
нистратора. Коротко говоря, полями в файле /usr/lib/crontab являются
минута, час, день месяца, месяц и день недели. Используя *, мы можем
установить принудительно многие из этих полей во все возможные значе-
ния. Входные данные для cron, копирующие мой регистрационный каталог в
4.00 утра каждый день каждой недели каждого месяца года, выглядят так:
0 4 * * * /usr/russ/bin/autobkp.cron
Обратите внимание, что вход в cron вызывает управляющую процедуру
вместо того, чтобы непосредственно использовать autobkp. Имеется
несколько важных причин, чтобы написать процедуру на базе утилиты
autobkp. Во-первых, cron не печатает диагностическую информацию на ваш
терминал, поэтому если что-нибудь идет не так, вы никогда об этом не
узнаете. Во-вторых, проще поддерживать усеченную версию autobkp, а зву-
ковые предупреждения добавлять в управляющую процедуру. Вы можете сде-
лать собственные модификации управляющей программы и не беспокоиться об
отсутствии сообщений от самой утилиты. Управляющую программу можно
настолько усложнить, насколько вы желаете. Представленная здесь вполне
работоспособна, но легко может быть дополнена.
# Cron-driven autobkp driver
echo "backed up: `date`" > /dev/tty00
/usr/bin/autobkp < /usr/russ/bin/autobkpath
>> /usr/russ/bin/autobkp.log
Этот драйвер выдает сообщение на терминал, запускает autobkp,
использует для ввода файл со списком маршрутов в каталоге bin и помеща-
ет все выводные сообщения в файл протокола. Отметим, что имя терминала
дано как абсолютное (tty00). Это правильно только в том случае, когда в
вашей системе имеется такой терминал. Использование этого имени терми-
нала позволяет сообщению появиться на экране даже если никто на нем не
зарегистрирован. Это хорошо, потому что первое, что вы сможете увидеть
утром на вашем экране - это сообщение. Если у вас нет указанного терми-
нала, вы можете сделать что-то другое, например, передачу самому себе
почтового сообщения.
Примеры
1. $ autobkp
Запускает программу без передачи ей файла со списком маршрутов и
без файла протокола. Поскольку поля FROM, TO, TYPE ищутся в стандартном
вводе, введите их вручную. Когда вы нажмете возврат каретки, autobkp
выполнит указанные действия, напечатает информацию на экран терминала и
будет ожидать дальнейшего ввода. Для завершения выполнения командного
файла введите ^d (в результате оператор read вернется с ненулевым ста-
тусом).
2. $ autobkp < pathlist
Получает все входные данные из файла со списком маршрутов, но пе-
чатает всю протокольную информацию на экран терминала. Autobkp заверша-
ется, когда прочитает все данные в файле pathlist.
3. $ autobkp >> logfile
Как и в первом случае, списки маршрутов должны быть введены с кла-
виатуры. Все выходные данные выводятся в файл протокола, а не на экран.
Для завершения autobkp введите ^d.
4. $ autobkp -c < pathlist >> logfile
Копирует файлы из одной области жесткого диска в другую (опреде-
ленную каталогом-приемником в файле pathlist). Берет все входные данные
из файла pathlist и выводит все выходные данные в файл logfile.
Пояснения
Строки 4-8 выполняют проверку на наличие ошибок. Autobkp может
быть вызван либо без указания опций, либо с одной опцией (-c, при
использовании cp). Вспомните, что переназначение ввода-вывода НЕ прини-
мается во внимание при рассмотрении аргументов, потому что командный
процессор интерпретирует символы переназначения и то, что следует за
ними, до вызова команды. Таким образом, если количество позиционных па-
раметров больше одного (#1 -gt 1), получаем ошибочное условие. Затем
выдается сообщение об ошибке и синтаксическая подсказка и программа за-
вершается.
В строках 10-13 проверяется использование ключа -c. Обратите вни-
мание, что мы не проверяем, равен ли параметр $# единице и не пытаемся
выделить первый символ, чтобы посмотреть, равен ли он "-". Это потому,
что такая проверка приведет к ошибке, если не указан никакой ключ (что
является верным синтаксисом, как указывалось ранее).
Если мы сказали
if [ $1 = -c ]
и не указали ключей, то команда проверки не сработает и будет вы-
дано сообщение о том, что "no argument in the statement" ("в операторе
нет аргументов"). Но если мы выполним экранирование, например, так:
if [ "$1" = "-c" ]
то кавычки допускают нулевое значение аргумента, так что проверка
правильно оценит недостающее значение $1 как "равен ли нуль -c?" Это
даст результат "ложь", поэтому все хорошо.
Попутно давайте внимательно рассмотрим работу команды проверки. Вы
можете выполнить проверку значения двумя способами. Первый - сравнение
строк, а второй - числовое сравнение. Переменные командного процессора
ВСЕГДА хранятся в виде строк. Вы можете, тем не менее, заставить систе-
му рассматривать эти последовательности как числа и интерпретировать их
ветствовать синтаксису команды grep. Если вы хотите освежить свою па-
мять, посмотрите grep(1) в руководстве по AT&T UNIX или grep(C) в руко-
водстве по XENIX. Для получения полной информации о синтаксисе посмот-
рите ed(1). Этот синтаксис является основой большинства команд, работа-
ющих с регулярными выражениями, таких как sed и grep.
Например, если вы используете выражение "*test*", выражение для
grep должно иметь вид ".*test.*". Его можно слегка изменить в зависи-
мости от того, что вы желаете иметь с каждой стороны цепочки test. В
данном случае синтаксис указывает все символы (.*), за которыми следует
цепочка t-e-s-t, а затем любая цепочка символов (.*). В этом случае
ключ имел бы вид "-e.\*test.\*". Это кажется немного странным, но это
соответствует синтаксису. (Двойные кавычки не являются частью команды.)
Символ обратной косой черты (\) используется для экранирования звездоч-
ка. Если вы не экранируете ее, командный процессор соотнесет ее с име-
нами всех файлов вашего текущего каталога, чего вы не желаете. Экрани-
рование ее позволит, чтобы нужный символ был передан dosflp, для
использования ее в grep-последовательности.
Ключ -h - это еще один из ключей прямого указания. Давайте вкратце
рассмотрим его синтаксис внутри dosflp. Это ".*\.h$", и он указывает
любой символ, за которым стоит одно или несколько вхождений любого сим-
вола (.*), литеральная точка (.\), символа h и вслед за ним конец стро-
ки (h$). Вы могли бы указать то же самое, используя ключ -e, но -h де-
лает это гораздо легче.
Ключ -l изменяет основное действие команды dosflp. Вместо копиро-
вания файлов он выдает список файлов. Это делается путем выполнения
различных команд вида dosxx, в данном случае dosdir. Ключ выдачи списка
полезен в dosflp, потому что вы можете получить список как информацию к
решению о том, что делать дальше, и вам нет необходимости помнить ко-
манду dosdir.
Ключ -r также изменяет основную операцию команды dosflp. В этом
случае файлы удаляются, а не копируются. Если вы указали этот ключ, вы-
дается сообщение, которое просит вас подтвердить, что вы хотите удалить
указанные файлы. Вы можете просто ответить "n", и запретить удаление,
если вы ввели этот опцию случайно. Напомним, что удаленные файлы или
файлы, включенные в список (в случае ключа -l), выбраны выражением
grep, которое жестко запрограммировано или указано пользователем. По
умолчанию выбираются ВСЕ файлы. Для ключа -r это соответствует тому,
что сказать "rm *".
Последний ключ, -s, обеспечивает возможность доступа к файлам, ко-
торые размещены внутри подкаталога на гибком диске DOS. Если вы обраща-
етесь только к имени устройства, по умолчанию ключ -s относится к ката-
логу самого верхнего уровня на гибком диске. Если нужный вам файл нахо-
дится в подкаталоге, вы должны использовать определенную нотацию, чтобы
попасть в него. Одно из различий между XENIX и DOS заключается в симво-
ле, используемом для разделения элементов маршрутного имени. XENIX
использует обычную запись в стиле UNIX - /x/y/z. В DOS применяется сим-
вол "обратная косая черта", т.е. \x\y\z. Но если вы хотите использовать
команды XENIX на гибком диске DOS, вы должны применять обычную запись
XENIX, a:/x/y/z. Это не совсем понятно, но правильно.
По умолчанию, dosflp копирует файлы с гибкого диска в
ваш текущий каталог на жестком диске. Если вы измените операцию на
выдачу списка или удаление, эта операция будет произведена на гибком
диске.
Примеры
1. $ dosflp -dB: -c -l
Выдает список всех файлов вида *.c на гибком диске DOS, размещен-
ном в устройстве B. В этом случае не происходит переход вниз в подката-
логи, а включаются лишь файлы, размещенные на верхнем уровне каталогов.
2. $ cd /destdir
$ dosflp -ssrc -e.\*src.\*
Переход в каталог, куда будут помещены файлы. Копируются файлы с
гибкого диска DOS (устройство A, подкаталог src), в текущий каталог.
Файлы для копирования указаны как *src*. В записи UNIX это выглядело бы
так: "cp A:/src/*src* .".
3. $ dosflp -r -stmp
Удаляет все файлы, размещенные в подкаталоге tmp на гибком диске
DOS (устройство A). Обратите внимание, что сам каталог не удаляется. В
записи UNIX это выглядело бы так: "rm A:/tmp/*".
4. $ sh -x `path dosflp` -dB:
Запускает процедуру dosflp в отладочном режиме выполнения.
Единственное ограничение при таком вызове командного процессора заклю-
чается в том, что файл данных, который вы посылаете ему (в данном слу-
чае dosflp), должен иметь полное маршрутное имя. Поскольку командный
процессор НЕ выполняет поиск маршрутного имени файла, нам необходимо
сперва найти маршрутное имя dosflp, затем передать его командному про-
цессору, запущенному в отладочном режиме выполнения, а также передать
процедуре dosflp аргумент в командной строке. Заметьте, что вызов
dosflp таким путем не меняет значение переменной $#, которое только
распознает ключ -dB: как аргумент.
Пояснения
Строки 4-6 выполняют инициализацию по умолчанию путем сохранения
значений в соответствующих переменных командного процессора. По умолча-
нию символ-шаблон ставится в соответствие всем файлам, указанным выра-
жением для команды grep .\*. Обратная косая черта требуется для экрани-
рования звездочки, поэтому она не перехватывается командным процессо-
ром. Устройство по умолчанию - A:. Операция по умолчанию - копировать
файлы, что указано значением "c" для переменной опции.
В строках 8-25 устанавливаются значения ключей и производится про-
верка на наличие ошибок. Если командная строка имеет некоторые аргумен-
ты ($# -gt 0), мы перебираем каждый аргумент и проверяем его. Если най-
ден допустимый ключ, переменные устанавливаются согласно ключу. Если
обнаружен недопустимый ключ, выдается сообщение об ошибке и программа
завершается с плохим статусом возврата.
Имеется два важных типа ключей. Ключи, которые выполняют прямое
указание типа файла, просто устанавливают переменную EXP в соответствии
с ключом. Аналогично, ключи, которые определяют, какой вид работы будет
выполняться процедурой, просто устанавливают соответствующую переменную
OP. Другие ключи должны обрабатываться путем извлечения одного или
нескольких символов из командной строки, которые следуют за флагом клю-
ча, эхо-отображения и конвейерной пересылки текущего аргумента ARG ко-
манде cut для извлечения символа (символов), начинающихся с третьего
символа аргумента, затем присвоения результата этой операции соот-
ветствующей переменной.
Из всего сделанного следует вывод, что пробелы между ключами и
символами, которые стоят за ними, не допускаются. Например, ключ -d
должен получить имя устройства. По синтаксису должно быть -dB:, но не
-d B:, потому что B: интерпретировалось бы как другой аргумент ARG в
цикле for, а это все испортит.
В строках 27-39 операция, которая должна быть выполнена, определя-
ется при помощи следующего оператора case. Если должно быть выполнено
копирование, выдается сообщение "copying" и выполняется то, что следует
за оператором case. Если должен быть выдан список файлов, выдается
сообщение об устройстве, содержимое которого должно распечататься, за-
тем выдается список файлов путем выполнения команды dosdir и конвейер-
ной пересылки результата команде more, после чего dosflp завершается.
Если файлы должны быть удалены, пользователю выдается запрос на
подтверждение удаления. Если ответ "yes", выдается сообщение, с какого
устройства файлы будут удалены. Если ответ "no", dosflp завершается.
Остаток командного файла имеет дело с механизмом копирования.
Строка 41 - это первый шаг в наведении моста над пропастью между двумя
типами носителей. Команда dosls использована для получения полного
списка файлов с гибкого диска. Перед тем как мы передадим этот список
во временный файл, мы пропустим его через команду tr (translate), кото-
рая преобразует все символы на нижний регистр, чтобы при копировании
файлов их имена были в нижнем регистре. В результате копии будут поме-
щены на диск XENIX с именами файлов в нижнем регистре. Если у вас есть
файлы с именами в верхнем регистре или в смеси регистров, вы должны
вручную исправить их после копирования.
Строки 43-50 выполняют само копирование. Цикл for запускается для
доступа к каждому файлу индивидуально. Это требование команд вида
dosxx. Вы должны получать доступ к одному файлу один раз, поскольку
этот уровень не обладает возможностью указания символа-шаблона. Имена
файлов, которые использует цикл for, определены путем использования ко-
манды grep для выбора имен соответственно выражению, установленному ра-
нее.
Имя каждого выбранного файла сначала отображается, так что пользо-
ватель может видеть, выполняется ли команда так, как ожидалось. В этом
месте мы можем сделать одну из двух вещей: или копировать файлы, или
удалить их. Эта операция определяется оператором case в строках 46-49.
Если операция - копирование файлов, файлы копируются из комбинации уст-
ройство-файл в текущий каталог. Обратите внимание, что в переменную
DRIVE включается подкаталог, если он был указан в командной строке. Это
объясняет наличие символа "/" в конце присвоения значения переменной
DRIVE в строке 16. Полное выражение должно быть таким: B:/subdir/file.
Если операция - удаление файлов, комбинация устройство/файл удаляется
выполнением команды dosrm. Попутно заметим, что маршрутное имя есть
нечто гибкое (или небрежное, в зависимости от того, как вы смотрите на
него) в том смысле, что вы можете сказать A:/subdir или A:subdir. Оба
варианта правильны. После того как все файлы будут обработаны, времен-
ный файл удаляется.
Одно из мест, где вы можете настраивать dosflp, это регулярные вы-
ражения. Уже включены выражения для .asm, .c и .h, но вы можете изме-
нить это или добавить больше ключей для любой последовательности, кото-
рую вы часто используете.
3.3. Средства получения резервных копий
3.3.1. autobkp - автоматичеески наращивамый файл резервной копии
---------------------------------------------------------------------
Имя: autobkp
_____________________________________________________________________
autobkp Автоматически наращиваемый файл резервной копии
Производит поиск по дереву файлов, которые изменялись за последние
24 часа, и пересылает их в другую систему (посредством uucp) или пере-
мещает их в другую область жесткого диска.
autobkp [-c] [
-c копирует файлы в другое место диска вместо
использования uucp
Пример вызова
autobkp < filelist >> bkplog
Копирует все файлы, указанные в filelist,
и записывает имена файлов в файл с именем bkplog
Командный файл autobkp
1 :
2 # @(#) autobkp v1.0 Automatic file backup Author: Russ Sage
4 if [ $# -gt 1 ]
5 then echo "autobkp: argument error" >&2
6 echo "usage: autobkp [-c] [
7 exit
8 fi
10 if [ "$1" = "-c" ]
11 then COPY=on
12 else COPY=off
13 fi
15 echo "\nBACKUP DATE `date '+%a %m/%d/%y %H:%M:%S'`"
16 echo "-----------------------------------------"
18 SYSTEM='' # destination system uucp node name
19 : ${SYSTEM:=`uuname -l`}
21 echo "Sourse system:\t\t`uuname -l`\nDestination system:\t$SYSTEM"
23 while read SRCDIR DESTDIR FILES
24 do
25 if [ ! -d $SRCDIR ]
26 then echo "autobkp: $SRCDIR is not a directory"
27 continue
28 fi
30 cd $SRCDIR
31 echo "\nFinding files in: $SRCDIR"
33 for FILE in `find . -type f -ctime 0 -name "$FILES" -print`
34 do
35 case $COPY in
36 off) uucp $FILE $SYSTEM!$DESTDIR;;
37 on) cp $FILE $DESTDIR;;
38 esac
39 echo " Transferred $FILE to $DESTDIR"
40 done
41 done
Переменные среды выполнения
COPY Флаг, определяющий, используется команда uucp или cp
FILE Имя каждого файла, найденного в исходном списке маршрутов
FILES Символ-шаблон, указывающий, какие файлы определены
PATH1 Имя маршрута-источника
PATH2 Имя маршрута-приемника
SYSTEM Имя системы-приемника для uucp
Описание
Зачем нам нужен autobkp?
Как мы заметили, файлы в UNIX плодятся как кролики. Чем больше
файлов мы создаем, тем сильнее желание сохранять их упорядоченными. До-
вольно легко стать ленивым или получить ложное представление о безо-
пасности и пренебречь регулярным копированием.
Вы можете подходить к копированию файлов несколькими путями. Наи-
более популярной стратегией является выполнение наращиваемого копирова-
ния, когда вся система копируется с некоторой начальной даты (и иногда
повторно с регулярными интервалами, но не часто). При коротких интерва-
лах (обычно ежедневно) файловая система проверяется на наличие файлов,
которые были модифицированы или добавлены за последние 24 часа. Такие
файлы копируются, поэтому копия в целом поддерживается такой, какой яв-
ляется система в настоящее время.
Где размещать копируемые файлы - это еще один интересный вопрос,
зависящий от конфигурации вашей системы, количества доступного прост-
ранства и важности данных. Давайте рассмотрим некоторые возможности.
Автономная микро- или супермикросистема может иметь всего один
жесткий диск. Если диск содержит достаточно места для размещения друго-
го раздела, вы можете копировать в этот раздел. Раздел может также
использоваться как неструктурированное устройство в отличие от файловой
системы и рассматриваться как магнитная лента или гибкий диск. Среди
других возможностей хранения информации могут быть второй жесткий диск,
кассетная лента или устройство копирования на ленту. Если вам недоступ-
на ни одна из этих возможностей, вы всегда можете копировать на гибкие
диски. Это утомительная ручная работа, но она может быть выполнена при
помощи команд tar или cpio.
Если вы также имеете доступ к другой, большей системе, такой как
общий главный компьютер, вы можете копировать файлы, посылая их в эту
систему посредством команды uucp. Даже если вы имеете достаточно места
в вашей собственной системе для сохранения ваших копий, у вас может
быть очень сильное желание послать копии всех важных файлов в главную
машину, потому что это даст вам выносную копию за пределами вашего
места расположения. Пожары, наводнения и др
ются.
Нам необходим механизм, который обычно запускается автоматически
(по команде cron или с помощью процедуры at, описанной в главе 5). Сна-
чала он обнаруживает все файлы, которые были изменены в последние 24
часа (надеемся, что вы уже имеете первоначальную копию всего). Он начи-
нает искать файлы из указанных каталогов и копировать подходящие файлы
в указанные каталоги-приемники. Он копирует файлы, используя утилиты,
которые наилучшим образом соответствуют используемой вами конфигурации.
Все эти вещи выполняются нашим командным файлом autobkp.
Что делает autobkp?
Вы перечисляете маршруты и autobkp находит файлы по этим маршрутам
и копирует их в то место, которое вы указали. Вы можете указывать имена
файлов по образцам, таким как *.c, *.h или каким-либо еще. С помощью
autobkp вы можете копировать важные файлы без копирования всех файлов.
Иногда это удобно - пропускать файлы при копировании. Типичные файлы,
которые вы, возможно, не хотите копировать, - это очень большие файлы
(не являющиеся важными, как файл core и файлы данных), временные файлы
(как *.o, которые вновь создаются при каждой новой компиляции) и испол-
няемые файлы, если у вас есть исходные программы на языке Си и вы може-
те их скомпилировать для получения новых исполняемых файлов. Пропуская
эти файлы, вы можете уменьшить размер ваших копий на мегабайты.
По умолчанию копирование производится командой uucp, которая пред-
полагает, что у вас подчиненная система по отношению к главной машине и
копирует ваши файлы в большую систему. Если вы хотите копировать ваши
файлы в другое место жесткого диска или на другой жесткий диск, исполь-
зуйте ключ -c для копирования командой cp вместо использования команды
uucp.
Во время процесса копирования на стандартный вывод выводятся сооб-
щения о состоянии дел. Это позволяет легко собрать все сообщения путем
переадресации stdout на время копирования. Если вы выполняете autobkp
вручную, сообщения выводятся на экран. Первое сообщение - это заголо-
вок, который печатает день, дату и время. Это выглядит так:
--------------------------
| BACKUP DATE Fri 05/23/86 17:33:35
|
Второе сообщение определяет систему-источник и систему-приемник.
Оно появляется ниже. В нашем примере система-источник - russ, а систе-
ма-приемник - vax.
--------------------------
| Source system: russ
| Destination system: vax
При каждом входе в систему-источник выдается следующее сообщение:
-----------------------------
| Finding files in: src_dir
|
где выражение src_dir - это место, откуда файлы будут переданы в
цикл копирования. Обратите внимание, что первое имя должно быть именем
каталога, потому что autobkp начинает именно с этого места поиск фай-
лов. Если первое имя не является каталогом, программа печатает сообще-
ние об ошибке и продолжает работу со следующим набором источник/прием-
ник для копирования.
Для каждого найденного файла печатается следующее сообщение после
завершения копирования:
------------------------------
| Transferred file to dest_dir
|
которое указывает, что файл file был скопирован в каталог-приемник
с именем dest_dir.
Файл со списком маршрутов
Чтобы сделать интерфейс настолько гибким, насколько это возможно,
autobkp читает стандартный ввод. Переназначая stdin, вы можете поддер-
живать разные списки файлов, которые необходимо копировать и переклю-
чать их в командной строке. Вы можете иметь один список маршрутов для
системных файлов, другой для исходных файлов, третий для личных файлов,
четвертый для файлов с готовым продуктом и так далее. Для каждой из
этих групп файлов создается список маршрутов и передается в качестве
входа для autobkp. Входные данные читаются как три поля: FROM, TO и
TYPE. Поле FROM - это каталог-источник. Поиск файлов начинается с этого
места. Напомним, что autobkp проходит вниз до конца дерева файлов, на-
чиная с указанного каталога.
Поле TO - это каталог-приемник, куда все файлы, найденные для дан-
ной записи в файле со списком маршрутов, помещаются на машине-приемнике
или в разделе-приемнике.
Поле TYPE - это описатель-шаблон, который сообщает autobkp, какие
файлы искать. Его значение может быть *, *.c, *src*, и так далее. Как
мы увидим позже, этот описатель передается команде find Unix, которая
фактически и выполняет поиск файлов. Вы можете использовать любое выра-
жение в поле TYPE, если оно соответствует синтаксису find.
Итак: все файлы, которые были изменены в последние 24 часа, обна-
руживаются в списке FROM с помощью описателя TYPE и копируются в об-
ласть TO.
Ниже приводится типичный файл со списком маршрутов. Он указывает
несколько каталогов, в которых производится поиск файлов. Обратите вни-
мание, что эти каталоги находятся под регистрационным каталогом: если
вы хотите скопировать ВЕСЬ регистрационный каталог полностью, вы можете
указать этот каталог, но здесь мы хотим выбрать только указанные ката-
логи.
/usr/russ/bin /pack1/russ/.bkp/bin *
/usr/russ/doc /pack1/russ/.bkp/doc *
/usr/russ/src /pack1/russ/.bkp/src *.c
/usr/product1 /pack1/russ/.bkp/product1 *.[ch]
Эти строки копируют каталоги bin, doc и src на локальной машине
автора. В случае каталога src мы указали, что копировать нужно только
исходные файлы на языке Си. Будет также скопирована некоторая полезная
информация из другого места этой же системы. Будут скопированы только
файлы с расширением *.c и *.h.
Место назначения (прямо указанное в командном файле автоматическо-
го копирования) - другая система UNIX. Место назначения - некоторый
смонтированный диск, регистрационный каталог, подкаталог копий (bkp).
Использование cron
Теперь, когда процедура autobkp знает, что искать, давайте скажем
ей, когда искать. Cron, вечный резидентный хранитель времени, может
легко выполнить эту работу. Входные данные для cron обычно устанавлива-
ются системным администратором (или кем-либо, кто имеет права записи в
/usr/lib/crontab), так что вы должны попросить администратора устано-
вить для вас вход в файл данных cron. Для получения дополнительной ин-
формации о входных данных cron, прочтите cron(1M) в Руководстве адми-
нистратора. Коротко говоря, полями в файле /usr/lib/crontab являются
минута, час, день месяца, месяц и день недели. Используя *, мы можем
установить принудительно многие из этих полей во все возможные значе-
ния. Входные данные для cron, копирующие мой регистрационный каталог в
4.00 утра каждый день каждой недели каждого месяца года, выглядят так:
0 4 * * * /usr/russ/bin/autobkp.cron
Обратите внимание, что вход в cron вызывает управляющую процедуру
вместо того, чтобы непосредственно использовать autobkp. Имеется
несколько важных причин, чтобы написать процедуру на базе утилиты
autobkp. Во-первых, cron не печатает диагностическую информацию на ваш
терминал, поэтому если что-нибудь идет не так, вы никогда об этом не
узнаете. Во-вторых, проще поддерживать усеченную версию autobkp, а зву-
ковые предупреждения добавлять в управляющую процедуру. Вы можете сде-
лать собственные модификации управляющей программы и не беспокоиться об
отсутствии сообщений от самой утилиты. Управляющую программу можно
настолько усложнить, насколько вы желаете. Представленная здесь вполне
работоспособна, но легко может быть дополнена.
# Cron-driven autobkp driver
echo "backed up: `date`" > /dev/tty00
/usr/bin/autobkp < /usr/russ/bin/autobkpath
>> /usr/russ/bin/autobkp.log
Этот драйвер выдает сообщение на терминал, запускает autobkp,
использует для ввода файл со списком маршрутов в каталоге bin и помеща-
ет все выводные сообщения в файл протокола. Отметим, что имя терминала
дано как абсолютное (tty00). Это правильно только в том случае, когда в
вашей системе имеется такой терминал. Использование этого имени терми-
нала позволяет сообщению появиться на экране даже если никто на нем не
зарегистрирован. Это хорошо, потому что первое, что вы сможете увидеть
утром на вашем экране - это сообщение. Если у вас нет указанного терми-
нала, вы можете сделать что-то другое, например, передачу самому себе
почтового сообщения.
Примеры
1. $ autobkp
Запускает программу без передачи ей файла со списком маршрутов и
без файла протокола. Поскольку поля FROM, TO, TYPE ищутся в стандартном
вводе, введите их вручную. Когда вы нажмете возврат каретки, autobkp
выполнит указанные действия, напечатает информацию на экран терминала и
будет ожидать дальнейшего ввода. Для завершения выполнения командного
файла введите ^d (в результате оператор read вернется с ненулевым ста-
тусом).
2. $ autobkp < pathlist
Получает все входные данные из файла со списком маршрутов, но пе-
чатает всю протокольную информацию на экран терминала. Autobkp заверша-
ется, когда прочитает все данные в файле pathlist.
3. $ autobkp >> logfile
Как и в первом случае, списки маршрутов должны быть введены с кла-
виатуры. Все выходные данные выводятся в файл протокола, а не на экран.
Для завершения autobkp введите ^d.
4. $ autobkp -c < pathlist >> logfile
Копирует файлы из одной области жесткого диска в другую (опреде-
ленную каталогом-приемником в файле pathlist). Берет все входные данные
из файла pathlist и выводит все выходные данные в файл logfile.
Пояснения
Строки 4-8 выполняют проверку на наличие ошибок. Autobkp может
быть вызван либо без указания опций, либо с одной опцией (-c, при
использовании cp). Вспомните, что переназначение ввода-вывода НЕ прини-
мается во внимание при рассмотрении аргументов, потому что командный
процессор интерпретирует символы переназначения и то, что следует за
ними, до вызова команды. Таким образом, если количество позиционных па-
раметров больше одного (#1 -gt 1), получаем ошибочное условие. Затем
выдается сообщение об ошибке и синтаксическая подсказка и программа за-
вершается.
В строках 10-13 проверяется использование ключа -c. Обратите вни-
мание, что мы не проверяем, равен ли параметр $# единице и не пытаемся
выделить первый символ, чтобы посмотреть, равен ли он "-". Это потому,
что такая проверка приведет к ошибке, если не указан никакой ключ (что
является верным синтаксисом, как указывалось ранее).
Если мы сказали
if [ $1 = -c ]
и не указали ключей, то команда проверки не сработает и будет вы-
дано сообщение о том, что "no argument in the statement" ("в операторе
нет аргументов"). Но если мы выполним экранирование, например, так:
if [ "$1" = "-c" ]
то кавычки допускают нулевое значение аргумента, так что проверка
правильно оценит недостающее значение $1 как "равен ли нуль -c?" Это
даст результат "ложь", поэтому все хорошо.
Попутно давайте внимательно рассмотрим работу команды проверки. Вы
можете выполнить проверку значения двумя способами. Первый - сравнение
строк, а второй - числовое сравнение. Переменные командного процессора
ВСЕГДА хранятся в виде строк. Вы можете, тем не менее, заставить систе-
му рассматривать эти последовательности как числа и интерпретировать их