Программа обработки архивов tar

Даже будучи очень внимательным...

6.1 Документация GNU tar
Будучи внимательным, первое, что вы можете проверить - что вы
действительно используете tar.


Опция '--version' генерирует послание,
дающее подтверждение, что вы пользуетесь tar, с указанием версии tar,
которую вы используете. tar идентифицирует себя и выводит номер своей
версии на стандатрный вывод, затем успешно выходит, ничего больше не
делая и игнорируя все остальные опции. Например, 'tar --version' может
возвратить:
GNU tar version 1.18.8
Второе, что вы можете захотеть узнать - написание и значение


некоторых опций tar без обращения к данному руководству, которое вы
уже однажды внимательно прочли. GNU tar имеет незначительные
возможности помощи, ее можно запустить с помощью опции '--help'. При
использовании этой опции tar выдает на стандартный вывод сообщение, в
котором перечисляются все доступные опции, затем успешно выходит,
ничего больше не делая и игнорируя все остальные опции. Даже хотя это
краткий обзор, он может быть несколько экранов длиной. Так что, если
вы используете не какой-нибудь тип прокручиваемого окна, вы можете
воспользоваться, например, этим:
tar --help | less
Это обозначает, что вы хотели бы использовать less для переворачивания
страниц. Чаще всего для этого используются еще more и pg.
Дотошный читатель должен был заметить определенные расхождения в
предыдущих абзацах. Там написано, что и '--version', и '--help' что-то
печатают и игнорируют все остальные опции. Фактически же они не могут
игнорировать друг друга,
какая сильнее: проведем эксперимент, действительно ли вам это
интересно.
- 109 -
Предоставляемая помощь очень сжата, и вам, может быть, придется
вернуться к полной документации. Если вы читаете этот абзац, значит, у
вас уже есть некоторое руководство по tar. Это руководство доступно в
печатном виде, как маленькая книжечка. Или можно его распечатать, если
у вас есть где-нибудь установленный TEX и лазерный принтер. Просто
установите это пособие, запустите команду 'make dvi', затем наберите
'doc/tar.dvi' обычным способом (спросите местного гуру, как это
делается). Если GNU tar удобно установлен на вашем месте, это


руководство также доступно в диалоговой, гипертекстуальной форме стиля
Info. Просто вызовите 'info tar', или, если у вас нет программы info,
используйте Info reader из GNU Emacs, вызвав tar из основного меню
Info.
6.2 Проверка прогресса tar
Обычно tar выполняет большинство операций, не выдавая пользователю
никакой информации, кроме сообщений об ошибках. При использовании
многих опций, часто со сложным и непредсказуемым поведением, можно
наделать много серьезных ошибок. tar обеспечивает несколько опций,
которые делают работу с ним легче. Эти опции заставляют tar выводить
информацию, как он прогрессирует в задании, и, может быть, вы захотите
использовать их, чтобы лучше представлять, что он делает. Однако, если
вы при оперировании архивом столкнулись с проблемой, вам нужна для ее
решения более подробная информация, чем просто сообщение об ошибке.
Нижеприведенные опции являются полезными диагностическими средствами.
Обычно команда '--list' для выдачи списка архива печатает имена
файлов (по одному на строке), а другие команды молчат. При
использовании большинства операций опция '--verbose' заставляет tar
печатать имя каждого файла или члена архива, как только он обработан.
Эта и другие опции, заставляющие tar печатать информацию о состоянии,
могут использоваться в контроле tar.
При использовании опций '--create', '--extract; или '--verbose' один
раз печатаются имена файлов или членов, как только они обработаны. При
- 110 -
использовании их дважды tar вынужден печатать для каждого члена более
длинный список (как при помощи 'ls -l'). В то время как '--list' сама
печатает имена членов архива, '--verbose', используемая с '-list',
заставляет tar печатать список файлов архива, как при помощи 'ls -l'.
В следующих примерах извлекаются члены архива и выдается длинный
список вывода:
tar --extract --file=archive.tar --verbose --verbose
tar xvv archive.tar
Словесный вывод возникает на стандартном выводе, за исключением
случая, когда архив записан на стандартный вывод, как с помощью 'tar


--create --file=- --verbose' ('tar cfv -', или даже 'tar cv' -
инсталлятор, позволяющий иметь архив по умолчании на стандартном
выводе). В этом случае tar записывает словесный вывод на стандартную
ошибку.
Опция '--totals', имеющая смысл только при использовании с
'--create', заставляет tar печатать все записанное в архив после того,
как он был полностью создан.
Опция '--checkpoint' выдает случайное сообщение, когда tar читает
или записывает архив. Фактически она печатает имена каталогов при
чтении архива. Она предназначена для тех, кому не нужен более
подробный (и объемный) вывод '--record-number' ('-R'), но кто хочет
получить наглядное подтверждение, что tar действительно делает
прогресс.
FIXME: Здесь небольшая неясность. Кажется, что -R выдает сообщение о
каждом блоке.
Опция '--show-omitted-dirs' при чтении архива с опциями '--list' или
'--extract', например, заставляет для каждого каталога архива, который
пропущен, печатать сообщение. Это происходит независимо от причины
пропуска: каталог может не быть назван на командной строке (явно или
неявно), или может быть исключен при помощи опции '--exclude=шаблон'...
Если используется '--record-number', tar печатает, наряду с другим
- 111 -
сообщением, которое он обычно выдает, номер записи в архиве, где было
запущено сообщение. Эта опция особенно часто используется при чтении
поврежденных архивов, она помогает точно указать поврежденный участок.
Ее также можно использовать с '--list' при чтении ленты резервного
копирования системы файлов, что позволяет вам выбрать из нескольких
лент резервного копировании при более позднем извлечении файла, где
отдается предпочтение ленте, где файл появляется раньше всего.
FIXME: xref, когда задан номер узла и написан раздел о резервном
копировании
6.3 Запрос о подтверждении во время операций
Обычно tar выполняет команду без остановки до дальнейших инструкций.
Однако в некоторых ситуациях вы можете захотеть исключить некоторые
файлы и члены архива из операции (например, если места на диске


недостаточно). Вы можете это сделать с помощью автоматического
исключения некоторых файлов
FIXME: pxref File Exclusion
или с помощью диалогового выполнения операции, используя опцию
'--interactive' ('-w'). tar также принимает '--confirm
ation' для этой опции.
Когда задана опция '--interactive' перед чтением, записью или
удалением файлов, tar сначала выдает сообщение для каждого файла,
указывая, какой операции он подлежит, затем спрашивает подтверждения
терминала. Действия, требующие подтверждения - добавление файла в
архив, извлечение файла из архива, удаление файла из архива и удаление
файла с диска. Чтобы подтвердить действие, вы должны ввести строку,
начинающуюся с 'y'. Если ваша строка начинается с какого-нибудь
другого символа, tar пропускает этот файл.
Если tar читает архив со стандартного ввода, он открывает
файл'/dev/tty' для диалогового общения.
- 112 -
6.4 Контроль за данными при их хранении
Вы можете убедиться в точности архива, сравнивая файлы системы с
членами архива. tar может сравнивать архив с системой файлов, как
только архив записан, чтобы проконтролировать операцию записи, или
может сравнивать с системой файлов прошлый записанный архив.
Чтобы сделать проверку на несоответствия в архиве сразу после того,
как он был записан, используйте опцию '--verify' в сочетании с
операцией '--create'. Когда задана эта опция, tar проверяет члены
архива и их противоположные части в системе файлов и сообщает о
несоответствиях на стандартный вывод. В многотомных архивах каждый том
проверяется после того, как он записан, перед записью следующего тома.
Чтобы проконтролировать архив, вы должны быть способными его
прочитать перед окончанием последней записи. Эта опция используется
для выявления ошибок в данных на некоторых лентах. Архивы, записанные
на каналы, некоторые картриджные устройства и т.п. не поддаются
контролю.
6.5 Сравнение архива с системой файлов *
Опция '--compare' сравнивает члены архива в существующем архиве с их
противоположными частями в системе файлов и сообщает различия в


размере файла, режиме, имени хозяина, датах модификации и содержимом.
Если файл представлен в архиве, но не существует в системе файлов, tar
сообщает об этом.
Если вы используете аргументы имени файла в сочетании с 'tar
--compare', tar сравнивает заархивированные версии заданных файлов с
их противоположными частями системы файлов. Если вы задаете файл,
которого нет в архиве, tar сообщает об ошибке. Если вы не задаете
никаких файлов, tar сравнивает таким образом все файлы архива.
Т.к. tar сравнивает только файлы архива с файлами системы файлов, а
не наоборот, он игнорирует файлы системы файлов, которых нет в архиве.
- 113 -
В нижеприведенном примере члены архива 'stooges' 'larry', 'moe' и
'curly'сравниваются с файлами под теми же именами в системе файлов.
tar --compare --file=stooges larry moe curly
Если, например, файла 'curly' не существует в архиве, tar cообщает
об ошибке:
сurly: does mot exist
6.6 Как сделать архивы tar более мобильными
Создание в отдельной системе архива tar, предназначенного для
дальнейшего использования на многих других машинах и с помощью других
версий tar, является более сложной задачей, чем может показаться.
Форматы архивов tar развиваются еще со времени первой версии Unix, и
не всегда совместимы друг с другом. В этом разделе обсуждаются
несколько проблем и даются советы, как сделать архивы tar более
мобильными.
Золотое правило - простота. Например, ограничьте содержимое ваших
архивов только регулярными файлами и каталогами. Не пытайтесь теперь
сохранить разреженные файлы. Давайте обсудим еще несколько проблем.
6.6.1 Мобильные имена
Используйте прямые файлы и имена каталогов, пополненные символами
ASCII, избегая двоеточий, /, \ и других "опасных" символов. Избегайте
вложений каталогов. Пользуясь машинами старше System V, ограничьте
имена ваших файлов и каталогов 14-ю символами.
Если вы собираетесь читать свои архивы под MSDOS, вы не должны
полагаться на различия в именах файлов и можете использовать программу


GNU doschk, которая поможет вам в дальнейшей диагностике неправильных
в MSDOS имен, на которые накладываются еще большие ограничения, чем в
- 114 -
System V.
6.6.2 Символьные указатели
Обычно, когда tar архивирует символьный указатель, он записывает
что-то в архив, называющийся как адресат указателя. Так tar получает
точную запись содержимого системы файлов. '--derefence' ('-h')
используется с '--create' и заставляет tar архивировать файлы, на
которые установлены символьные указатели, вместо самих указателей. При
использовании этой опции, когда tar сталкивается с символьным
указателем, он архивирует указанный файл вместо того, чтобы просто
записать присутствие символьного указателя.
Имя, под которым файл хранится в системе файлов, не записано в
архиве. Чтобы записать и имя символьного указателя, и имя файла в
системе файлов, заархивируйте файл под обоими именами. Если все
указатели были записаны автоматически tar, указатель может быть
направлен на имя файла, больше не существующего в системе файлов.
Если tar опять сталкивается с файлом, на который смотрит указатель,
при создании того же архива, сохраняется вторая его копия. (Это может
рассматриваться как ошибка.)
Итак, для мобильных архивов не архивируйте символьные указатели как
таковые и используйте '--derefence': многие системы не предполагают
символьных указателей и, более того, ваши построения, может быть, не
смогут использоваться, если они содержат символьные указатели.
6.6.3 Старая V7 и архивы POSIX
GNU tar использует ранний стандарт POSIX 1003.1 ustar, который
отличается от последнего стандарта. Сделать доступ к возможностям
последней версии - нетривиальная задача.
Определенные старые версии tar не могут содержать дополнительную
информацию, записанную в более новых программах tar. Чтобы создать
- 115 -
архив формата V7 (а не ANSI), который можно прочитать этими старыми
версиями, задайте опцию '--old-archive' ('-j') в сочетании с
'--create'. tar также принимает '--portability' к этой опции.


Когда вы
ее задаете, tar не включает информации о каталогах, каналах, смежных
файлах, файлах устройства и задает информацию о хозяине в виде группы
и идентификатора пользователя вместо группы и имени пользователя.
При модифицировании архива не используйте '--old-archive', если
архив был создан не с помощью этой опции.
В большинстве случаев архив нового формата может быть прочитан
старой программой tar без особых проблем, так что эта опция редко
бывает нужна. С другой стороны, большинство современных tar могут
читать архивы старого формата, так что, может быть, вам удобнее будет
использовать '--old-archive'.
6.6.4 Проблемы проверки
SunOS и HP-UX tar не принимают архивы, созданные GNU tar и
содержащие не-ASCII имена файлов, потому что они используют
символизированные контрольные суммы, тогда как tar использует
несимволизированные контрольные суммы при создании архивов, как в
стандарте POSIX. При чтении GNU tar и считает контрольные суммы, и
что-нибудь принимает. Меня очень беспокоит то, что многие люди
пытаются произвести резервное копирование своих файлов, используя
дефектное (или по меньшей мере нестандартное) программное обеспечение,
и их ничему не научает пересохранение их ошибочных файлов с помощью
несоответствующего извлечения файлов.
GNU tar предполагает вычисление обеих сумм, символизированных и
несимволизированных, и что-то принимает. Однако 1.12.1 имеет ошибку,
из-за которой символизированная контрольная сумма неправильно
инициализируется и поэтому не работает. Это было исправлено в
последующих версиях GNU tar. Но GNU tar не модифицирован для создания
неправильных архивов, чтобы читать их с помощью ошибочного tar.
- 116 -
Я рассказывал, что вначале, когда Sun импортировал tar на свои
системы, они его перекомпилировали без учета того, что контрольные
суммы были по-разному сосчитаны из-за изменения в символизации char в
их компиляторе. Так что они начали считать контрольные суммы
неправильно и впоследствии стали несовместимыми сами с собой.

Содержание раздела