порядке расположения описатель файла, что обычно НЕ совпадает с отсор-
тированным порядком. Вы НЕ МОЖЕТЕ получить отсортированный список фай-
лов для копирования командой tar, если только не сделаете еще одну точ-
ную копию всех данных, которые вы хотите скопировать и не разместите
описатель файла в отсортированном порядке. Как это сделать? Вот так:
cd $HOME
find . -print | sort | cpio -pdv /bkpsort
При этом получится новая копия всех ваших данных и имена файлов
разместятся в отсортированном порядке. Если после этого вы перейдете в
каталог /bkpsort и выполните команду tar, файлы будут перенесены на
носитель в отсортированном порядке.
Предположим, что для выполнения копирования требуется 15 дискет.
При восстановлении этого полного набора вы должны вводить приведенную
ниже команду 15 раз, поскольку на каждом из гибких дисков располагается
уникальный образ копии.
tar xvf /dev/fd048ds9
Такие повторные вводы команды раздражают, но они могут облегчить
жизнь, что мы вскоре и увидим.
Команда cpio является следующим поколением команд копирования. Ее
общие функции подобны функциям команды tar, но имеется несколько важных
отличий. Во-первых, вы должны сгенерировать список файлов для cpio, что
означает использование команды find для порождения списка. Поскольку мы
можем конвейером пропустить список, полученный от команды find, через
команду sort, нам нет необходимости делать еще одну копию всех наших
файлов для получения отсортированного списка.
Далее, команда cpio не выполняет выравнивание границу килобайта.
Она пакует все данные непрерывно и имеет магическое число в заголовке
для указания начала каждого нового файла. В команде cpio также нет ука-
зания размера образа на носителе. Как она это узнает? Драйвер уст-
ройства должен определить размер и послать соответствующий сигнал об-
ратно команде cpio, которая после этого приостанавливается и предлагает
вставить следующую дискету. Это все прекрасно до тех пор, пока вы не
попадаете в систему, в которой драйверы ужасны, как в системе XENIX.
Драйверы XENIX не распознают, когда нужно остановиться и продолжают вы-
полнять работу и после того, как достигнут конец гибкого диска. Прог-
рамма cpio должна была бы выполняться одинаково на всех системах, но
она не работает корректно на машинах с системой XENIX.
Одно существенное различие между командами cpio и tar заключается
в получающемся образе копии. Поскольку cpio не различает границ между
различными носителями (дискетами), файлы получаются разорванными между
двумя гибкими дисками. Это значит, что когда вы пытаетесь копировать с
этих 15 дискет, то они являются ОДНИМ непрерывным потоком входных дан-
ных, точно так, как и последовательный поток выходных данных при созда-
нии этой копии. Что произойдет, если дискета номер 2 повредится? ВСЕ
ваши файлы после второй дискеты стали бесполезны. Вы просто потеряли
весь ваш образ копии. Поскольку tar копирует в виде отдельных образов,
когда дискета номер 2 потеряется, вы все равно можете копировать с
дискет 3-15 без проблем.
Еще один прекрасный аспект команды cpio заключается в том, что она
может работать как в формате файловой системы, так и в потоковом форма-
те. Формат файловой системы (опция -p) обращается к блочным уст-
ройствам, таким как жесткий диск, а потоковый формат обращается к нест-
руктурированным устройствам (опции -i и -o), таким как магнитная лента
или гибкий диск с форматом низкого уровня. Cpio - это прекрасная утили-
та для использования ее при копировании файловых деревьев системы на
жестком диске.
Как же управляется с этим система 4.2 BSD? В течение многих лет
применялась команда tar для пересылки туда и обратно, как описано на
страницах руководства по tar(1). Не самый элегантный подход, но рабо-
тоспособный. Сейчас они имеют ключ -r (для рекурсивного обхода дерева
сверху вниз) для обычной команды cp. Я же по-прежнему считаю, что ко-
манда cpio лучше.
3.4. Средства проверки операций копирования
3.4.1. dsum - контрольные суммы двух катологов
---------------------------------------------------------------------------
Имя: dsum
_____________________________________________________________
dsum Контрольная сумма двух каталогов
НАЗНАЧЕНИЕ
Выдает на экран выходные данные команды sum системы UNIX для двух
копий файлов из двух разных каталогов в одной строке. Это позволяет
быстро визуально оценить, одинаково ли содержание файлов и может быть
использовано для проверки копии.
ФОРМАТ ВЫЗОВА
dsum [-c|-o] control_dir backup_dir
Пример вызова
dsum $HOME/bin /mnt
Просматривает, были ли какие-либо файлы изменены при копировании
из моего регистрационного каталога на гибкий диск, смонтированный в ка-
талоге /mnt.
Командный файл dsum
1 :
2 # @(#) dsum v1.0 Dual directory sum Author: Russ Sage
4 if [ $# -lt 2 -o $# -gt 3 ]
5 then echo "dsum: invalid argument count" >&2
6 echo "usage: dsum [-c|-o] control_dir backup_dir" >&2
7 echo " -c = C source files, -o = object files" >&2
8 exit 1
9 fi
11 case $# in
12 2) FLIST=*;;
13 3) case $1 in
14 -c) FLIST=*.c;;
15 -o) FLIST=*.o;;
16 *) echo "dsum: invalid argument $1" >&2
17 echo "usage: dsum [-c|-o] control_dir
bacup_dir" >&2
18 exit 1;;
19 esac
20 shift;;
21 esac
23 for FILE in $1/$FLIST
24 do
25 BASEF=`basename $FILE`
26 if [ `expr $BASEF : '.*'` -lt 7 ]
27 then echo "`$BASEF: \t'`sum $FILE | cut -d' '
-f1`\t\c"
28 else echo "$BASEF:\t`sum $FILE | cut -d' '
-f1`\t\c"
29 fi
30 sum $2/$BASEF | cut -d' ' -f1
31 done
Переменные среды выполнения
BASEF Содержит базовое имя файла из полного маршрутного
имени
FILE Содержит имя каждого проверяемого файла
FLIST Содержит указание на тип проверяемых файлов
Описание
Зачем нам нужен dsum?
В среде разработки программ всегда имеется масса файлов. Эти файлы
содержат все: исходный код, перемещаемые модули, объектный код, данные,
тексты. Другим аспектом среды разработки программ является то, что эти
файлы обычно рассыпаны по многим различным машинам (или группам машин,
может быть и такой случай). В этом случае всегда кажется, что имеется
очень много перемещений файлов: эти файлы передаются из одной системы
на другую, некоторые модифицируются, пересылаются обратно и так далее.
Похоже на то, как в армии роют ямы: вы делаете это, потому что вам при-
казано.
Когда вы перемещаете много файлов, то какой путь является лучшим
для того, чтобы гарантировать себе (или кому-либо еще), что выполненная
вами копия является ТОЧНО такой, как и оригинал? Если вы внесли ошибку
в первоначальную копию, затем распространили эту ошибку на многие копии
или даже записали вместо оригинала модифицированную копию, то вы можете
никогда не вернуться в первоначальное состояние.
Одним из способов слежения за копиями является использование ко-
манды sum. Эта команда читает данные и выводит число, являющееся разно-
видностью контрольной суммы. Другими утилитами UNIX, которые делают
что-то подобное, являются cmp для сравнения объектных файлов и diff для
обнаружения различий в текстовых файлах.
Автор привык думать, что sum будет сообщать об отличии даже в од-
ном бите (своего рода циклическая избыточная проверка), но это оказа-
лось совсем не так. Недавно имелся 35 Кбайтный файл, содержащий в виде
длинного формата список файлов, которые должны были быть скопированы. В
действительности, там были два файла, один из которых был отсортирован,
а другой нет. Они были одного размера, и sum выдала одно и то же число
для обоих файлов. Когда же cmp сравнила эти два файла, оказалось, что
39-е байты отличаются. Как мы можем объяснить тот факт, что sum
рассматривала эти два файла как совершенно одинаковые? Возможно, sum
свернула эти два файла таким образом, что контрольная сумма оказалась
одинакова, даже хотя один из файлов был отсортирован, а другой нет.
Это значит, что sum на самом деле не выполняет контрольную провер-
ку каждого бита. Только проверка алгоритма работы программы в исходном
модуле позволит убедиться в этом. Конечно, в большинстве случаев, если
файл отличается от оригинала, то это не является простой перестановкой
данных, так что sum все-таки полезна.
Что делает dsum?
Dsum - это утилита, которая выполняет проверку после копирования.
Она предполагает, что файлы скопированы из каталога-источника в ката-
лог-приемник. Каталог-источник назван управляющим каталогом, поскольку
он следит за тем, какие файлы сравниваются. Для каждого файла в управ-
ляющем каталоге печатается его имя вместе со значением его контрольной
суммы и со значением контрольной суммы для скопированного файла в ката-
логе-приемнике. Вся эта информация выдается в одной строке.
Польза от получения всей информации от dsum в одной строке заклю-
чается в том, что визуально два файла могут быть проверены очень легко.
Вам нет необходимости смотреть в другое место для получения необходимой
информации.
Альтернативой для dsum может быть выполнение какого-либо сценария,
подобного приводимому ниже.
1. Скопируйте ваши файлы в другой каталог.
2. Подсчитайте контрольную сумму всех файлов из управляющего
каталога и выведите результат в какой-либо файл.
3. Подсчитайте контрольную сумму всех файлов в каталоге,
содержащем копию, и выведите результат в какой-либо файл.
4. Сравните эти два файла командой diff для того, чтобы
увидеть, не отличаются ли какие-либо копии.
Это не дает вам даже хорошего вывода на экран о том, что происхо-
дитгиЭто не дает вам даже хорошего вывода на экран о том, что происхо-
Dsum не проходит вниз по дереву файлов, потому что большинство ко-
пий являются копиями из каталога в каталог, а не из сегмента дерева в
сегмент дерева. Из-за того, что она не выполняет такой обход, сложность
программы существенно понижается.
По умолчанию сравниваются ВСЕ файлы. Это предполагает, что вы ско-
пировали все файлы в каталог копирования. В некоторых случаях вы можете
захотеть копировать только выбранные файлы, такие как *.c (все ваши
исходные файлы). В этом случае управляющий каталог содержит множество
файлов, а каталог с копиями содержит только файлы с расширением .c.
Для поддержки таких случаев в программу включены ключи -c и -o.
Ключ -c указывает только файлы типа *.c из управляющего каталога. В ре-
зультате производится проверка только файлов *.c в каталоге с копией.