нужную работу.
Нам не нужен выход команды egrep, а только ее статус возврата.
Если egrep обнаруживает одно из указанных ей выражений, она заверша-
ется со статусом успеха, или 0. Тем самым проверка if включает выпол-
нение оператора then, который в данном случае выводит нас из конструк-
ции if-then-else и продолжает цикл while, пропуская таким образом
файл.
Если же egrep не обнаружила ни одну из указанных символьных
строк, то выполнение продолжается с оператора else, который выполняет
еще одну команду file и переадресовывает ее вывод на устройство с име-
нем /dev/tty. Это универсальное имя устройства, которое гарантирует
вам вывод на экран вашего терминала. UNIX обеспечивает, что указание
/dev/tty обходит любые команды переадресации вывода, действующие в
данный момент. Поскольку стандартный вывод уже переадресован для всего
цикла while, то нам нужно попасть на устройство /dev/tty, чтобы вывод
шел на экран терминала, а не в файл печати. Отображение на терминал
имени обрабатываемого файла позволяет пользователю знать, какой файл
будет добавлен к распечатке.
Если файл удовлетворяет нашим критериям, он обрабатывается коман-
дой pr. Результат направляется в стандартный вывод, который переад-
ресован циклом while так, чтобы результат четко попадал в один файл.
Отметим, что нам нужно поставить символ добавления в файл вывода (>>).
В противном случае мы получим запись на место существующего файла пе-
чати, а значит в файле печати будет находиться только последний обра-
ботанный файл.
После того как все файлы обработаны, задается вопрос о том, хоти-
те ли вы вывести результирующий файл на печать. Предлагается ответить
на этот вопрос "да" (yes) или "нет" (no), однако в программе проверя-
ется только положительный ответ (yes). Это значит, что нажатие любой
клавиши трактуется как ответ "no", кроме клавиши "y", означающей "да".
Ответ пользователя читается с клавиатуры, и проверяется, является ли
он символом "y". Если да, то файл ставится в очередь на печать. Если
нет, дальнейшая проверка не производится и командный файл завершается.
Отметим, что запрос о выводе на печать поступил в стандартный вы-
вод. Переадресация вывода действовала только во время работы цикла
while, а затем прекратилась. Так было сделано потому, что цикл while
был фактически еще одним порожденным shell-процессом (subshell) и пе-
реадресация действовала только в этом те внимание, что маршрутная-
установите значения переменных вне цикла, а затем измените их внутри
цикла. После завершения цикла переменные по-прежнему имеют свои перво-
начальные значения, а не измененные в цикле значения. Измененные зна-
чения касались переменных порожденного интерпретатора shell, которые
исчезли, когда порожденный shell завершился. Переменные интерпретатора
shell могут передавать значения только вниз, порожденным процессам, но
процессы-потомки не могут передавать значения переменных вверх, роди-
тельскому процессу. Обычно передача значений переменных поддерживается
при помощи какого-либо файла, в котором хранятся данные для обмена
между родительским процессом и процессом-потомком.


    УПРАВЛЕНИЕ ВЫВОДНЫМИ ФАЙЛАМИ БОЛЬШИХ РАЗМЕРОВ



Как мы уже отмечали, общий размер выводного файла ограничен. На-
помним, что команда find проходит все дерево каталогов вниз до конца
по всем поддеревьям, начиная с каталога, имя которого указано в ко-
мандной строке. Если вы находитесь на вершине очень глубокого дерева,
то обрабатываться могут буквально сотни файлов. Поскольку вы ограниче-
ны максимальным размером выводного файла, вы можете обработать только
ограниченное число файлов. Конечно, количество файлов, которое вы мо-
жете обработать, зависит также от того, насколько велики входные фай-
лы.
Если выводной файл достигает своего максимума, все добавляемые
после этого данные теряются. Потеря данных весьма болезненна, и обычно
требуется некоторое время, чтобы ее обнаружить. В медленно работающей
системе попытка обработать большое дерево, например все исходные
тексты системы UNIX, может занять целый час и даже больше, прежде чем
выходной файл заполнится. Это означает, что вы должны находиться рядом
и следить за тем, когда файл переполнится. Если он все-таки перепол-
нился, вы должны все выбросить и начать сначала. Это также означает,
что вы должны перейти вниз по дереву. Это может быть проблемой в сба-
лансированных деревьях.
Например, рассмотрим каталог /usr/lib. Этот каталог содержит мно-
го файлов на первом уровне и много каталогов первого уровня. Если бы
мы не обработали все файлы каталога /usr/lib за одну попытку, мы долж-
ны были бы пойти вниз по подкаталогам каталога /usr/lib. Попытки де-
лать это вручную и запускать pall в каждом подкаталоге заняли бы много
времени и могли бы привести к ошибкам с вашей стороны. Кроме того,
pall допускает указание только одного имени каталога, что приведет к
получению большого количества распечаток и к путанице при их сортиров-
ке.
Что же делать? Радикальным решением является увеличение значения
ulimit. Вы можете сделать это либо с помощью программы на языке Си,
использующей системный вызов ulimit, либо командой shell'а ulimit.
Техника выполнения такой работы представлена в главе 7.

    ВОЗМОЖНЫЕ МОДИФИКАЦИИ



Возможно, вы захотите добавить свои собственные штрихи в некото-
рых местах командного файла. Первым местом является то, где указыва-
ются символы поиска файлов программной разработки. Символы, использо-
ванные нами - это наиболее употребимые суффиксы в UNIX. Если вы
используете не Си и ассемблер, а другие языки, то вы можете добавить
соответствующие символы.
Следующим местом, где могут быть сделаны дополнения, являются оп-
ции, которые может понимать pall. Вам могут понадобиться файлы с опре-
деленными именами или определенными типами, например, файлы nroff. Эти
опции могут быть легко добавлены в оператор case, что улучшит команду.
Последним местом возможных изменений является тип файлов, которые
нужно пропускать. Символьная строка для команды egrep покрывает боль-
шинство важных нетекстовых типов файлов. В вашей системе могут быть
какие-то особые типы или же имена могут быть другими. Если вам необхо-
димо дополнить строку, сделайте это. Команда egrep может обработать
довольно много информации. Я не знаю ее ограничений. Возможно, вы об-
наружите их, просматривая исходный текст утилиты egrep. Если получа-
ется слишком длинная строка и не помещается на экране, ничего страшно-
го. Перенос на следующие строки экрана не опасен, пока общее количест-
во символов не превысит 255. Опасно только указывать переадресацию
символьной строки if на нулевое устройство в следующей после команды
egrep строке. Кажется, что все работает правильно, но это не так. Пе-
реадресация должна указываться в той же строке, где стоит команда
egrep.
В данной главе сделано очень много. Наиболее важно то, что полу-
чено множество новых идей, которые можно использовать при эксплуатации
программной среды и просмотре файлов любого типа. В следующей главе мы
углубимся в рутинную работу по ежедневному сопровождению файлов и
используем изученные средства, чтобы они облегчили нашу жизнь.

    * ГЛАВА 3. Поддержка файловой системы *


СОДЕРЖАНИЕ

ВВЕДЕНИЕ
3.1. СОПРОВОЖДЕНИЕ ФАЙЛОВ
3.1.1. Операции сопровождения
3.1.2. Средства пересылки файлов
3.1.3. Средства копирования
3.1.4. Средства проверки операции копирования
3.2. ПЕРЕСЫЛКА ФАЙЛОВ
3.2.1. cptdir - копирование дерева каталога
3.2.2. can - удаление файлов в "мусорную корзину"
3.2.3. dosflp - копирование файлов с гибкого диска формата MS-DOS
с использованием символов шаблона в именах файлов
3.3. СРЕДСТВА ПОЛУЧЕНИЯ РЕЗЕРВНЫХ КОПИЙ
3.3.1. autobkp - автоматически наращивамый файл резервной копии
3.3.2. cpiobr - копирование и восстановление файлов в виде потока
данных
3.4. СРЕДСТВА ПРОВЕРКИ ОПЕРАЦИЙ КОПИРОВАНИЯ
3.4.1. dsum - контрольные суммы двух катологов
3.4.2. log - меню доступа к файлам протокола копирования

    ВВЕДЕНИЕ



Даже "небольшая" система UNIX с малым числом пользователей порож-
дает сотни файлов в ходе обычной работы. В процессе программирования вы
можете создавать множество файлов для различных версий ваших программ.
Ведение почты и запись текста при помощи редактора vi способствует то-
му, что накапливается еще больше файлов. Такие утилиты, как uucp, lp и
другие добавляют еще больше файлов. Если у вас система UNIX установлена
на микро-ЭВМ, то ваш жесткий диск начинает переполняться. В больших
многопользовательских системах дисковая память редко считается пробле-
мой, но в действительности всегда кажется, будто файлы стремятся расши-
риться до заполнения всей доступной дисковой памяти. Поэтому каждый
пользователь должен нести ответственность за расход дискового прост-
ранства. (Если вы платите за дисковую память, то у вас также могут быть
финансовые стимулы.) Однако, то, что вы хотите сохранить, вы хотите
СОХРАНИТЬ. Именно здесь начинается работа по созданию резервных копий.

    3.1. СОПРОВОЖДЕНИЕ ФАЙЛОВ



В предыдущей главе мы разработали некоторые средства поиска и
отображения информации, помогающие нам поддерживать жизненный путь всех
наших файлов. Теперь мы собираемся обратиться к важнейшим рутинным ра-
ботам, которые позволят избежать хаоса и катастрофы.
Сопровождение файлов означает избавление от файлов, которые нам
больше не нужны и в то же время систематическое копирование тех файлов,
которые мы хотим сохранить. Для этого требуется возможность использова-
ния разнородных доступных носителей данных. Сопровождение файлов подра-
зумевает также ряд систематических, повторяющихся задач, а это означа-
ет, что мы можем создать средства системы UNIX для автоматизации этого
процесса.

    3.1.1. ОПЕРАЦИИ СОПРОВОЖДЕНИЯ



Сопровождение файлов включает два вида операций: создание резерв-
ных копий (копирование) и удаление "мусора".
Копирование - это дань уважения, которую мы платим за хрупкость
физических данных в руки Мерфи и других богов энтропии. Хорошее
средство копирования является быстрым, гибким, простым в использовании
и стимулирует пользователей часто копировать самые важные файлы. В
последующем тексте будут представлены различные методы копирования,
пригодные для разных конфигураций системы и типов носителей.
Имеется два вида резервных копий: "мягкие" и "твердые". "Мягкие"
резервные копии - это копии в другом файле или каталоге в той же или в
другой файловой системе (т.е. разделе) на том же или другом жестком
диске. Такого рода копирование сделать легко и оно предохраняет от на-
носимого самому себе ущерба, такого как удаление файла по невниматель-
ности. Чаще всего для такого типа копирования используется наше
средство cptdir. Основной недостаток мягкого копирования заключается в
том, что вы по-прежнему уязвимы для таких воздействий, которые влияют
на ваш физический носитель (обычно жесткий диск) так, что и оригинал и
копия оказываются разрушенными.
"Твердая" копия - это копия на другом устройстве или даже в другой
системе UNIX. Средства, представленные ниже в данной главе, управляют
такого рода копированием и дают вам возможность выполнять копирование
такого типа и с такой периодичностью, которые соответствуют объему ва-
шей вычислительной системы, уровню ее активности и важности хранимых
данных.
Твердое копирование всегда несколько утомительно, потому что диски
или ленты должны быть смонтированы (или должна быть установлена связь с
другой системой), а эта операция требует много времени. Преимущество,
естественно, заключается в том, что вы больше не зависите от целост-
ности какого-либо одного устройства.
Автоматизируя нашу процедуру копирования, мы стараемся сделать его
как можно менее болезненным. Делая наши средства копирования в какой-то
степени разумными, мы можем выбрать только файлы, которые нуждаются в
копировании, и тем самым сохранить время и память. Наилучший способ
обеспечить, чтобы копирование выполнялось регулярно - минимизировать
время и требуемые для этого усилия. Наконец, создание процедур для про-
верки правильности копий даст вам спокойствие духа.
"Удаление мусора" можно автоматизировать путем указания и подго-
товки к удалению файлов, которые, вероятно, будут временными, либо ка-
ких-то других файлов, которые созданы (но не обязательно разрушены) при
компиляции, выполнении конвейеров или другими операциями. Вы также мо-
жете указывать файлы, специфичные для ваших работ как не подлежащие
удалению.

    3.1.2. СРЕДСТВА ПЕРЕСЫЛКИ ФАЙЛОВ



Первая группа средств - это простые универсальные переносчики фай-
лов. Программа cptdir может копировать каталог (и любые подчиненные ка-
талоги, лежащие ниже в дереве) в каталог-приемник. Каталог-приемник -
это обычно каталог, назначенный в качестве резервной копии для некото-
рого проекта.
Программа can берет на себя необходимую рутинную работу - убирает
"мусор". Эта программа позволяет вам выбрать типы временных файлов, ко-
торые должны периодически удаляться. Направляя их в "мусорный" каталог,
can предоставляет вам возможность просмотреть все, что было удалено, и
восстановить то, что вы на самом деле хотите сохранить.
Программа dosflp допускает применение символов-шаблонов в именах
файлов, используемых при копировании отобранных файлов с дискет формата
MS-DOS в XENIX. Это упрощает операцию копирования и уменьшает число на-
жатий на клавиши.

    3.1.3. СРЕДСТВА КОПИРОВАНИЯ



Далее представляется "рабочая лошадка" - средства копирования.
Autobkp использует список маршрутных имен, чтобы определить, какие
части файловой системы должны быть проверены. Затем эта программа копи-
рует из выбранных областей те файлы, которые были добавлены или измене-
ны в последние 24 часа.
Cpiobr предоставляет интерактивное дополнение к команде cpio
системы UNIX. Она позволяет вам скопировать файлы с жесткого диска на
гибкий и, если необходимо, восстановить их с гибкого диска на жесткий.

    3.1.4. СРЕДСТВА ПРОВЕРКИ ОПЕРАЦИЙ КОПИРОВАНИЯ



Выполнение копирования не избавит вас от волнений, пока вы не бу-
дете знать, что вы скопировали все, что хотели, и что копирование прош-
ло корректно. Программа dsum использует контрольную сумму для проверки
того, что исходный каталог и каталог-копия содержат одни и те же файлы.
Программа log отображает регистрационный файл, чтобы показать, какое
автоматическое копирование выполнялось в четыре часа утра, когда вы
(надеемся) спали.
При создании этих средств мы просмотрим некоторые важные команды
системы UNIX и обнаружим новые способы их использования. Когда вы про-
работаете всю данную главу, вы будете знать, как работать "с мельчайши-
ми частицами" при использовании файловой системы UNIX. Вы сможете авто-
матизировать иную большую область ваших компьютерных будней. Вы должны
суметь создать пользовательские утилиты копирования и верификации,
удовлетворяющие вашим нуждам. Вы сможете перевести вашу систему в режим
работы, обеспечивающий ей самостоятельное выживание. (Мы оставляем фи-
лософам определять, даст ли это вашему компьютеру примитивную форму
жизни!)
Между прочим, многие средства в данной главе пользуются преиму-
ществами рекурсивных методов обхода дерева, которые мы разработали в
предыдущей главе. Вы можете просмотреть тот материал, если у вас име-
ются затруднения в понимании того, что представлено здесь.

    3.2. ПЕРЕСЫЛКА ФАЙЛОВ



3.2.1. cptdir - копирование дерева каталога

ИМЯ: cptdir
cptdir Копирует дерево каталога в другое место

ФУНКЦИЯ
Копирует дерево файловой системы, корень которого расположен в ка-
талоге, в другой каталог системы. Нет ограничений на какой-либо специ-
фический каталог или жесткий диск.
ФОРМАТ
cptdir [-s] каталог-источник каталог-приемник
ПРИМЕР ВЫЗОВА
cptdir $HOME /bkp
Копирует каждый файл из $HOME в каталог /bkp.

КОМАНДНЫЙ ФАЙЛ cptdir

1 :
2 # &(#) cptdir v.1.0 Copy a directory tree Autor: Russ Sage

4 if [ $# -lt 2 -o $# -gt 3 ]
5 then echo "cptdir: argument error" >&2
6 echo "usage: cptdir [-s] srcdir desdir" >&2
7 echo " -s silent mode" >&2
8 exit 1
9 fi

11 if [ "$1" ="-s" ]
12 then OPT="-pd"
13 shift
14 else OPT="-pdv"
15 fi

17 SRC=$1
18 DEST=$2
19 umask 0

21 if [ -d $DEST ]
22 then echo "\"$DEST\" already exist. Remove it? (y/n): \c"
23 read CMD
24 if [ "$CMD" = "y" ]
25 then rm -rf $DEST
26 mkdir $DEST
27 fi
28 else mkdir $DEST
29 fi

31 if [ "`echo $DEST|cut -c1`" = "/" ]
32 then cd $SRC
33 find . -print | sort | cpio $OPT $DEST
34 else PWD=`pwd`
35 cd $SRC
36 find . -print | sort | cpio $OPT $PWD/$DEST
37 fi

    ПЕРЕМЕННЫЕ СРЕДЫ


CMD Команда, полученная от пользователя
DEST Каталог-приемник, в который нужно копировать
OPT Опции, которые передаются утилите cpio
PWD Текущий рабочий каталог
SRC Каталог-источник, из которого нужно копировать

Описание
Зачем нам нужен cptdir?

Мы уже отмечали необходимость в дополнительных командах, которые
рекурсивно обходят древовидную структуру файловой системы UNIX. В ран-
них версиях UNIX единственная команда tar могла управлять движением по
дереву. В более новых версиях системы имеется опция -r в команде cp,
которая делает cp рекурсивной (эта возможность реализована только в
последней версии System V) и команда cpio. Последняя является многоце-
левой командой копирования, которая может иметь дело как с потоковым
форматом, так и с форматом файловой системы.
Проблема при использовании даже таких улучшенных стандартных ко-
манд системы UNIX состоит в том, что вам необходимо указать множество
деталей и убедиться в том, что вы правильно используете синтаксис.
Ошибки могут привести к потере времени и даже хуже того, к неожиданным
побочным эффектам. С некоторыми из этих эффектов связаны изменения прав
доступа и владельца, порядок распределения индексных дескрипторов фай-
лов (inode), размещения файлов-приемников и результирующие полные име-
на. Очень много необходимо запомнить и заново вызывать каждый раз при
копировании. Поскольку такое копирование делается не часто, тяжело за-
помнить все эти детали. Мы разрешаем эту проблему, автоматизируя детали
процесса и в то же время предоставляя пользователю гибкость и управле-
ние результатами. Мы создаем инструменты для управления файлами, кото-
рые являются хорошими дополнительными средствами к основным командам
системы UNIX.

Что делает cptdir?

Процедура cptdir копирует каталог (и все дерево под ним, если оно
существует) в другой каталог системы. Поскольку каталоги предусматрива-
ют логический доступ и не являются аппаратно-зависимыми (в отличие от
имен устройств), то вы можете легко копировать файлы в другое место на
том же диске или копировать их на другой диск полностью без специально-
го синтаксиса или опций.
Вы можете указать, хотите ли вы, чтобы на экран выводились имена
копируемых файлов. Если вы не хотите этого, используйте опцию -s
("silent" - молчаливый). По умолчанию используется режим "verbose"
(многословный), который отображает имена по мере копирования файлов.
Заметьте, что это копирование, а не перемещение файлов. Недостаток
копирования в отличие от перемещения заключается в том, что если прием-
ником является каталог на том же диске, то вам требуется дополнительное
место на диске для размещения второго образа. Вам также необходимо
иметь достаточно описателей файлов (inodes) для сохранения всех файлов.
В противном случае вы можете лишиться шанса сбросить в "мусорную корзи-
ну" ваши рабочие файлы.
В командной строке допустимо указание каталога-источника и имя ка-
талога-приемника. Единственный ключ, допустимый в командной строке -
это "-s". Любой другой ключ приводит к завершению команды, не вызывая
никаких разрушений. Вы, конечно, можете добавить программный код с
целью проверки опции и выдачи сообщения о допустимых ключах, если ука-
зано нечто отличное от -s. Если вы делаете еще какую-либо проверку на
наличие ошибок сверх того, что требуется для предотвращения разрушения
данных или системы, то это дело личного вкуса. Минимизация проверок на
наличие ошибок дает более компактные и быстрые сценарии, подходящие для
опытных пользователей.
Если указанный каталог-приемник не существует, то он создается.
Если каталог-приемник уже существует, выдается сообщение об этом и вам
задается вопрос о том, хотите ли вы очистить его. Если вы ответите
"yes", каталог уничтожается и создается снова пустым. Если вы ответите
"no", каталог остается таким, какой есть и копируемые файлы просто до-
бавляются к уже существующим в наличии. При этом может возникнуть неко-
торая путаница, особенно если некоторые файлы с такими именами уже су-
ществуют в каталоге-приемнике. В большинстве случаев, однако, у пользо-
вателей не появляется желания добавлять свою копию в существующий ката-
лог.
Тем не менее каталог-приемник должен быть создан, поскольку необ-
ходимо его наличие, чтобы команда cpio работала правильно. Если же его
нет, cpio не выполнится и выдаст сообщение об ошибке.
Процедура cptdir начинает копирование путем прохождения по катало-
гу-источнику и формирования списка файлов, находящихся в нем, рекурсив-
но обходя дерево сверху вниз. В результате может получиться, что скопи-
руется больше, чем вы планировали, поэтому вам необходимо знать размер
файловой структуры, которую вы хотите скопировать. Затем файлы копиру-
ются в каталог-приемник. Исходные файлы никак не модифицируются и не
изменяются (за исключением того, что дата последнего доступа может быть
модифицирована).
Когда идет копирование, на экран выдается сообщение от cpio, кото-
рое показывает полный маршрут к файлам-приемникам. Этот маршрут должен
соответствовать маршруту, указанному в командной строке, в противном
случае что-то не так.

Примеры
1. $ cd /mnt
$ cptdir /bin .
Перейти на другой диск (обычно смонтированный в каталоге /mnt) и
копировать все файлы из каталога /bin в текущий каталог. Обратите вни-
мание, что результирующими файлами будут /mnt/*, что может не совпадать
с вашим желанием.
2. $ cd /bin
$ cptdir . /mnt/bin
То же, что и в предыдущей команде, но обратите внимание, что точка
изменила свою позицию. Команда указывает копирование всех файлов теку-
щего каталога в каталог /mnt/bin. Получаются файлы /mnt/bin/*, что выг-
лядит более резонным.
3. $ cptdir /bin /mnt
То же, что и в примере 1.
4. $ cptdir /bin /mnt/bin
То же, что и в примере 2.

Пояснения

В строках 4-9 производится проверка аргументов командной строки.
Если указано меньше двух аргументов, этого недостаточно. Как минимум
должны быть указаны имена каталога-источника и каталога-приемника. Бо-
лее трех аргументов слишком много. Самое большее, там должны быть опция
-s, каталог-источник и каталог-приемник.
В строках 11-15 устанавливаются ключи команды cpio. По умолчанию
это pdv, что означает "pass" (передача) для копирования в формате фай-
ловой системы (в отличие от необработанного потока данных), "directory"
(каталог) для создания каталога при необходимости и "verbose" (мно-
гословный) для выдачи имен файлов по мере их копирования. Если первым
позиционным параметром является ключ -s, который указывает запуск
cptdir в молчаливом режиме, ключи команды cpio не содержат ключа выдачи
сообщений и, таким образом имена файлов не выдаются на экран.
Строки 17,18 и 19 устанавливают каталоги "откуда" и "куда" и уста-
навливают переменную umask в 0. Переменная umask определяет подразуме-
ваемые права доступа для всех файлов, созданных нашим командным про-
цессором. Мы изменяем umask для гарантии того, что все файлы копируются
в дерево-приемник и ни один из них не будет заблокирован из-за
отсутствия прав чтения или записи. Побочным эффектом является то, что
все каталоги имеют права доступа вида rwxrwxrwx, а все файлы - вида
rw-rw-rw-, что может потребовать изменений для обеспечения вашей безо-
пасности. Изменение umask имеет действие только на время работы проце-
дуры. Когда cptdir завершается, umask вашего вызывающего командного
процессора остается неизменным.
Строки 21-29 выполняют проверку каталога-приемника. Если он уже
существует, вас запрашивают, нужно ли его удалить и заново создать.
Если он не существует, он создается для работы cpio.
Строки 31-36 выполняют непосредственно копирование. Прежде чем
объяснить, что здесь делается, давайте сперва посмотрим, как работает
cpio. Поскольку оператор find генерирует список файлов, нам необходимо
представлять, как его выход может влиять на выполнение cpio.
Если мы указали "find . -print", то полные имена файлов будут
иметь точку впереди, например:
./dir
./dir/file1
./dir/file2
Это относительная нотация, которая очень полезна, когда вы не хо-