Вперед Назад Содержание

2. ВВЕДЕНИЕ В ТAR

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

Перед тем, как перейти к этой главе, убедитесь, что вы уже понимаете и отчетливо представляете, что такое "архив" и "член архива".

B примерах операций tar строкам, которые вы должны напечатать, предшествует '%' - это обычное приглашение оболочки. В примерах и в обсуждении в тексте мы используем мнемонические формы операций и опций, но краткие их формы дают тот же результат.

Большая часть опций tar дана и в краткой, и в длинной формах. Опции, описываемые во введении, (за исключением '--delete', которая не имеет сокращенной формы) имеют следующие аббревиатуры:

'--create' '-c' '--list' '-t' '--extract' '-x' '--append' '-r' '--verbose' '-v' '--file=имя_архива' '-f имя архива'
Эти опции облегчают набор длинных команд. Например, вместо того, чтобы набирать

tar --create --file=/tmp/afiles.tar --verbose apple agnst asparagus
можно набрать

tar -c -f /tmp/afiles.tar -v apple angst asparagus
Для более подробной информации по синтаксису опций

Когда мы упоминаем какую-нибудь мнемоническую опцию в тексте, мы также иногда даем соответствующую краткую опцию в скобках.

2.1 Как создавать архивы *

Для создания нового архива используйте опцию '--create' (-c). В общем случае можно использовать опцию '--file=имя_архива' ('-f имя_архива') для задания имени, которое будет иметь архив tar. Затем задайте имена файлов, которые вы хотите поместить в новый архив. Например, чтобы занести файлы 'apple', 'angst' и 'asparagus' в архив по имени 'afiles.tar', используйте следующую команду:

tar --create --file=afiles.tar apple angst asparagus
При использовании мнемонических опций порядок аргументов не важен. Вы можете также набрать:

tar apple --create angst --file=afiles.tar asparagus

Однако этот порядок труднее для восприятия. В данном руководстве мы даем список аргументов в причинно-следственном порядке, чтобы сделать команды более легкими для понимания, но вы можете набирать их в том порядке, который вам нравится.

Если вы не задали имена файлов для занесения в архив, то tar создаст пустой архив. Нижеследующие команды создают архивы, в которых ничего нет:

tar --create --file=empty-archive.tar
Где бы вы не использовали '--create' ('-c'), tar уничтожает текущее содержимое файла c помощью '--file=имя_архива' ('-f имя_архива'), если он существует. Чтобы добавить файлы в существующий архив, вы должны использовать другую опцию.

Когда архив создается с помощью '--create' ('-c'), имена членов архива такие же, как имена файлов, которые вы набрали в команде tar. Таким образом имена членов 'afiles' (как созданные в первом примере, приведенном ранее) - 'apple', 'angst' и 'asparagus'. Однако предположим, что архив был создан с помощью следующей команды:

tar --create --file=bfiles.tar./ballons baboon ./bodacious

Тогда файлы 'ballons', 'baboon' и 'bodacious' будут помещены в архив (потому что './' - синоним текущего каталога), но их имена как членов архива будут './ballons', 'baboon' и './bodacious'.

Если вы хотите увидеть, как tar заносит файлы в архив, вы можете использовать опцию '--verbose' ('-v').

Если один из файлов, названный с помощью '--create' ('-c') - каталог, то операция tar более сложна.

Если вы не задали опцию '--file=имя_архива' ('-f имя_архива'), то tar будет использовать что-то по умолчанию. Обычно это некоторое физическое ленточное устройство, подключенное к вашей машине. Если не существует подключенного ленточного устройства, или реакция на умолчание не определена, tar выдаст сообщение об ошибке. Это сообщение об ошибке выглядит приблизительно следующим образом:

tar: can't open /dev/rmt8 : No such device on address tar: can't open /dev/rsmt0 :I/O error
Если вы получили подобную ошибку при ссылке на не заданный вами файл ('/dev/rmt8' или '/dev/rsmt0' в вышеприведенном примере), то tar использует значение по умолчанию для '--file=имя_архива' ('-f имя_архива'). Но предпочтительнее задать аргумент '--file=имя_архива' ('-f имя_архива), где бы вы не использовали tar, чем полагаться на значение по умолчанию.

Чтобы создать новый архив, используйте опцию '--create' ('-c'). Вы можете также задать имя и формат архива (и другие характеристики), и можете использовать аргументы имени файла для задания файлов, которые нужно занести в архив. Если вы не хотите использовать опции или аргументы имени файла, tar будет использовать значение для умолчания.

Создание архивов файлов *

Нижеследующий пример покажет вам, как создать архивный файл, если ваш рабочий каталог содержит еще и другие файлы. В этом примере используются три файла под названиями 'blues', 'folk' и 'jazz'. Архивный файл называется 'records'. Кроме того, что архив в данном примере записывается в систему файлов, его можно записать на магнитную ленту. (Если вы хотите проследить этот и следующие примеры, создайте подкаталог, содержащий файлы с этими именами. Чтобы создать каталог, наберите 'mkdir practice' в качестве приглашения для системы. Вы можете создать файлы при помощи текстового редактора, например emacs).

Если вы хотите заархивировать каталог, содержащий файлы, перечислите содержимое каталога.

Наберите:

% cd practice % ls
Система отвечает:

blues folk jazz %
Это для того, чтобы проверить, что файлы, подлежащие архивации, действительно существуют в рабочем каталоге, и чтобы проверить, что имя архива, которое вы выбрали, еще не использовано. Если бы оказалось, что оно уже использовано, tar бы записал новый архив на место старого, и содержание последнего бы уничтожилось.

Затем:

Наберите:

% tar --create --file=records blues folk jazz
Если вы сейчас перечислите содержание рабочего каталога ('ls'), вы найдете архивный файл, записанный так же, как и файлы, которые вы видели раньше.

% ls blues folk jazz records %
Этот пример показывает, как создавать архивный файл в рабочем каталоге, содержащем еще и другие файлы. Три файла, которые вы архивируете в данном примере, называются 'blues', 'folk' и 'jazz'. Архивный файл называется 'records'. Т.к. архив в примере записан в систему файлов, его можно записать на любое другое устройство.

(Если вы хотите проследить этот и другие примеры, создайте каталог по имени 'practice', содержащий файлы 'blues', 'folk' и 'jazz'. Чтобы создать каталог, наберите 'mkdir practice' в качестве приглашения системе. Вероятно, легче всего создать архив при помощи текстового редактора, например Emacs.)

Прежде всего перейдите к каталогу, содержащему файлы, которые вы хотите заархивировать:

% cd practice
Теперь '~/practice' - ваш рабочий каталог.

Теперь проверьте, что файлы, подлежащие архивации, действительно существуют в рабочем каталоге, и убедитесь, что в рабочем каталоге нет файла с тем именем архива, которое вы хотите использовать:

Чтобы получить список имен файлов рабочего каталога, наберите:

% ls
Cистема отвечает:

blues folk jazz %
Затем: Наберите:

% tar --create --file=records blues folk jazz
Если вы теперь перечислите содержание рабочего каталога, вы найдете файл архива, записанный так же, как файлы, которые вы видели раньше.

% ls blues folk jazz records %

Использование tar в словесном режиме *

Когда имена файлов или членов задают каталоги, оперирование tar более сложно. Обычно, когда назван каталог, tar также рекурсивно оперирует со всем его содержанием. Таким образом, для tar имя файла '/' называет целую систему файлов.

Чтобы заархивировать все содержимое каталога, используйте '--create' ('-c') или '--append' ('-r') и задайте имя каталога. Например, чтобы заархивировать содержимое текущего каталога, нужно использовать 'tar --create --file=имя_архива.'. При этом вы получите имена членов архива, начинающиеся с '/'. Для того, чтобы заархивировать содержимое каталога с именем 'foodir', используется 'tar --create --file=имя_архива foodir'. В этом случае все имена членов будут начинаться с 'foodir/'.

Если вы даете tar команду типа 'tar --create --file=foo.tar.', то вам будет сообщено: 'tar: foo.tar is the archive; not dumped'. Это случилось потому, что архив 'foo.tar' был создан перед тем, как туда были занесены файлы. Затем, когда tar пытается занести все файлы в архив, он замечает, что файл 'foo.tar' - то же, что архив, и пропускает его. (Нет смысла вкладывать архив в себя.) GNU tar в этом случае будет продолжать и и создаст архив как обычно, за исключением одного этого файла. Однако другие версии tar не такие "умные" и, когда такое случается, начинают бесконечный цикл. Таким образом, нужно убедиться, что в каталог не входит архив.

При извлечении файлов нужно также назвать на командной строке члены архива каталога. tar несовершенен в интерпретации имен членов. Команда 'tar --extract --file=имя_архива.' извлекает не все содержимое из архива, а только тех членов, чьи имена начинаются с '/'.

Создание архива из верхнего каталога *

Вы можете заархивировать каталог с помощью задания его имени в качестве аргумента имени файла. Файлы каталога будут заархивированы относительно рабочего каталога, и все содержимое каталога будет создано заново, когда архив будет извлечен.

Чтобы заархивировать каталог, в первую очередь нужно переместиться на его верхний каталог. Если вы следуете введению, вы должны набрать:

% сd .. %
В верхнем каталоге вы можете задать подкаталог как аргумент имени файла. Для того, чтобы сохранить каталог 'practice' в файле 'music' архива, наберите:

% tar --create --verbose --file=music practice
tar выведет:

practice/ practice/blues practice/folk practice/jazz practice/records
Заметьте, что архив таким образом создается не в подкаталоге 'practice', а в рабочем каталоге - в том, из которого был вызван tar. Перед тем, как пытаться заархивировать каталог с верхнего каталога, вы должны убедиться, что у вас есть доступ не только к каталогу, который вы пытаетесь заархивировать с помощью tar, но и к рабочему каталогу. Попытка сохранить ваш домашний каталог в архиве с помощью вызова tar из корневого каталога, вероятно, не удастся.

(Заметьте также, что 'records', начальный файл архива, сам заархивирован. tar воспринимает любой файл, независимо от его содержания, как файл для архивации. Когда извлекается 'music', файл 'records' архива будет записан заново в систему файлов).

Вы можете сохранить каталог в архиве, используя имя каталога как аргумент имени файла tar. Когда вы задаете файл каталога, tar архивирует его и все файлы, которые этот каталог содержит. Имена каталога и файлы, которые он содержит, хранятся в архиве, относящемся к текущему рабочему каталогу: когда каталог извлечен, они записываются в систему файлов, соответствующую рабочему на этот момент каталогу.

Чтобы заархивировать каталог, в первую очередь переместитесь на его верхний каталог. Если вы следуете введению, наберите:

% cd .. %
В верхнем каталоге задайте подкаталог, используя аргумент имени файла. Чтобы сохранить файл '~/practice' каталога в файле 'music' архива, наберите:

% tar --create --verbose --file=music practice
tar ответит:

practice/ practice/blues practice/folk practice/jazz practice/records
Заметьте, что '~/practice/records', другой файл архива, сам заархивирован. tar воспринимает любой файл, даже файл архива, как подлежащий архивации.

Сравнение файлов архива с файлами системы файлов *

Несмотря на то, что операция '--list' ('-t'), заданная c помощью опции '--verbose' ('-v'), используется при сравнении файлов в текущем архиве с файлами системы файлов (что позволяет пользователю сравнивать размер и даты модификации), проще заставить сам tar cравнивать атрибуты файлов и сообщать о различиях между файлами. Чтобы это сделать, используйте операцию '--compare' ('-d') или '--diff'.

Операция '--compare' ('-d'), как показывает ее название, заставляет tar сравнивать файлы и каталоги в архиве с помощью противоположных частей (файлов с тем же именем) в системе, и возвращать различия в размере файлов, режиме, датах создания и модификации. При выполнении операции '--compare' tar имеет дело только с файлами архива, игнорируя файлы активной системы файлов, если они не существуют в архиве. Если tar дается имя файла, не существующего в архиве, он выдает сообщение об ошибке.

Чтобы сравнить файлы в каталоге с их противоположными частями в файле 'records' архива в том же каталоге, вы должны, находясь в каталоге 'practice':

% tar --compare --file=records %
Несмотря на то, что кажется, будто ничего не происходит, фактически tar производит сравнение и не находит, что сказать. Тот же пример с помощью опции '--verbose' выдаст список файлов архива в том порядке, каком они сравниваются с противоположными частями с теми же именами:

% tar --compare --verbose --file=records blues blues: mod time differs blues: size differs folk jazz jazz; does not exist %
Вы опять не заметите, что хотя '--compare' заставляет tar сообщать о файлах, не существующих в системе файлов, tar игнорирует файлы активной системы файлов, не существующие в архиве. Чтобы это продемонстрировать, создадим файл в каталоге 'practice' по имени 'rock' (используя текстовый редактор). Если вы вызовете список каталога, то увидите, что там появился новый файл.

% ls blues folk records rock
Если вы опять выполняете '--compare', вы получаете следующее:

% tar --compare --verbose --file=records blues blues: mod time differs blues: size differs folk jazz jazz: does not exist %
tar игнорирует файл 'rock', потому что он сравнивает файлы архива с файлами системы файлов, а не наоборот. Если 'rock' проходит как аргумент имени файла, tar возвращает сообщение об ошибке:

% tar --compare --verbose --file-records rock tar: rock not found in archive %

Чтобы сравнить атрибуты членов архива с атрибутами других противоположных частей в системе файлов, используется операция '--compare' ('-d') или 'diff'. Хотя вы можете использовать '--list --verbose' ('-tv') для сравнения вручную некоторых атрибутов файлов, проще заставить сам tar сравнивать атрибуты файлов и сообщать о различиях в них.

Операция '--compare', как видно из ее имени, сравнивает члены архива с файлами под теми же именами в системе файлов, и сообщает о различиях в размере, режиме, датах создания и модификации. 'tar + compare' имеет дело только с членами архива: он игнорирует файлы системы файлов, не хранящиеся в архиве. Если вы с '--compare' даете ('-d') аргумент имени, который не соответствует имени члена архива, tar отвечает сообщением об ошибке.

Чтобы сравнить члены архива в файле 'records' архива с файлами в каталоге '~/practice', в первую очередь нужно перейти к каталогу 'practice'. Затем:

% tar --compare --file=кусщквы %
Хотя кажется, чтол ничего не произошло, tar на самом деле производит сравнение и не находит, что сообщить.

Используйте опцию '--verbose' для того, чтобы получить список имен членов архива, сравниваемых с противоположными частями с теми же именами в системе файлов:

% tar --compare --verbose --file=records blues folk jazz %
Если tar нашел, что сообщить, он это сделает, как только сравнит все файлы.

Если вы удаляете файл 'jazz' из системы файлов ('rm jazz') и модифицируете файл 'blues' (например, добавлением текста с помощью редактора типа Emacs), верхний пример будет выглядеть следующим образом:

% tar --compare --verbose --file=records blues blues: mod time differs blues: size differs folk jazz jazz; does not exist %
Заметим опять, что в то время как '--compare' докладывает об именах членов архива, не имеющих противоположных частей в системе, он игнорирует файлы системы, не имеющие противоположных частей в архиве. Чтобы это продемонстрировать, создададим файл в каталоге 'practice' по имени 'rock' (используя любой текстовый редактор). Новый файл появляется, когда вы смотрите содержимое каталога:

Использование сравнения начиная с верхнего каталога *

Кроме использования '--compare' для сравнения отдельных файлой архива с их противоположными частями в системе файлов, эту опцию можно использовать для сравнения заархивированных каталогов с их противоположными частями в действующей системе файлов. Вы можете создать заново верхний пример, используя ваш домашний каталог и файл 'music' (в котором хранится каталог 'practice') вместо архивного файла 'records'.

В первую очередь перейдите к домашнему каталогу ('cd..'). Затем постарайтесь проделать то же, что в предыдущем примере, используя 'music' в качестве заданного архивного файла, а каталог 'practice' как аргумент имени файла.

% tar --compare --verbose --file=music practice practice practice/blues practice/blues: mod time differs practice/blues: size differs practice/folk practice/jazz practice/jazz: does not exist practice/records
Кроме использования '--compare' ('-d') для сравнения текстовых файлов, вы можете его использовать для сравнения каталогов. Чтобы это проиллюстрировать, нужно переделать вышеприведенные примеры, используя ваш домашний каталог в качестве рабочего каталога, и используя архивный файл '~/music' вместо архивного файла '~/practice/records'.

В первую очередь перейдите к вашему домашнему каталогу ('cd~'). Затем попытайтесь использовать в вышеприведенном примере 'music' в качестве заданного архивного файла, а 'practice' - в качестве аргумента имени файла.

% tar --compare --verbose --file=music practice
Если вы следовали этой инструкции, tar ответит:

practice practice/blues practice/blues: mod time differs practice/blues: size differs practice/folk practice/jazz practice/jazz: does not exist practice/records

2.2 Как составлять список архивов *

Используйте '--list' для выведения имен членов, хранящихся в архиве. Опцию '--file=имя_архива' используйте так же, как c '--create' ('-c') для задания имени архива. Например, содержимое архива 'afiles.tar', созданного в прошлом разделе, можно проверить с помощью команды 'tar --list --file-afiles.tar'. tar выдаст:

apple angst asparagus
Список архива 'bfiles.tar' будет таким:

./baloons baboon ./bodacious
(Разумеется, 'tar --list --file-afiles.tar' не вызовет никакого вывода).

Если вы используете опцию '--verbose' ('-v') с помощью '--list' ('-t'), tar выдаст список, напоминающий список при использовании 'ls -l' и содержащий имя хозяина, размер файла и т.д.

Вы можете также задать имена членов, используя '--list' ('-t'). В этом случае tar выдаст список только тех имен членов, которые вы идентифицировали. Например, 'tar --list --file-afiles.tar apple' выдаст только 'apple'. Это очевидно, когда заданные в качестве имен членов имена в точности являются именами членов. Например, 'tar --list --file=bfiles baloons' ничего не выдаст, потому то нет члена по имени 'baloons', а только './baloons'. Хотя 'baloons' и './baloons' - имена одного и того же файла, при простейшем сравнении, для которого необходим точный набор, имена членов различаются.

Список содержимого архива *

Вы можете можете получить список только что созданного архива с помощью другой опции tar: '--list' ('-t'). Чтобы получить список содержимого архива, наберите:

% tar --list --file=records
tar ответит:

blues folk jazz

для получения более подробной информации об операции '--list' ('-t').

Вы можете использовать '--list' для вывода списка файлов архива. Если вы используете аргументы имени файла в этой операции, tar ищет заданные файлы в архиве и высвечивает их имена, только если они действительно там хранятся. Bы можете использовать '--list'('-t') с опцией '--verbose' ('-v'), чтобы узнать атрибуты (имя хозяина, размер и т. д.) хранимого файла.

Вы можете получить список содержимого архива и с помощью другой операции tar: '--list' ('-t'). Чтобы получить список только что созданного архива, наберите:

% tar --list --file=records
tar ответит:

blues folk jazz

для получения более подробной информации об операции '--list' ('-t').

В предыдущем примере вы создавали архив 'music' в домашнем каталоге. Чтобы получить список 'music':

Таким образом:

% tar --list --file=music practice/ practice/blues practice/folk practice/jazz practice/records
Используйте '--list' ('-t') для выдачи имен файлов, хранящихся в архиве. Если вы используете аргументы имени файла в этой операции, tar выдаст имена заданных файлов, если они хранятся в архиве. Если вы используете имя каталога как аргумент имени файла, tar выдает также имена всех нижележащих файлов, включая подкаталоги. Если вы не используете аргументы имени файла, tar выдает имена всех членов архива.

Вы можете использовать '--list' c '--verbose' для вывода атрибутов членов архива (имени хозяина, размера и т.д.).

Чтобы получить список имен файлов, хранящихся в архиве, используйте операцию '--list' ('-t') tar.

В предыдущем примере вы создали архив '~/music'. Чтобы получить список его содержимого, находясь в вашем домашнем каталоге:

Таким образом:

% tar --list --file=music practice/ practice/blues practice/folk practice/jazz practice/records

Получение дополнительной информации о файле *

Когда вы задаете опцию '--verbose' ('-v') вместе с '--list' ('-t'), tar выдает дополнительную информацию о перечисляемых файлах (защита файла, хозяин и идентификатор группы, размер, и дату и время создания). Вышеприведенный пример в словесном режиме будет:

% tar --list --verbose --file=music drwxrwxrwx myself/user 0 May 31 21:49 1990 practice/ -rw-rw-rw- myself/user 42 May 21 13:29 1990 practice/blues -rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk -rw-rw-rw- myself/user 40 May 21 13:30 1990 practice/jazz -rw-rw-rw- myself/user 10240 May 31 21:49 1990 practice/records %
Заметьте, что '--verbose' с '--list' не заставляют tar выводить имена файлов, а при использовании '--verbose' в сочетании со всеми другими операциями этот эффект наблюдается.

Для получения более подробной информации, когда вы заносите в список имена файлов, хранящихся в архиве, задайте опции '--verbose' и '--list'.

tar напечатает защиту членов архива, имя хозяина, групповой идентификатор, размер, дату и время создания.

Например:

% tar --list --verbose --file=music drwxrwxrwx myself/user 0 May 31 21:49 1990 practice/ -rw-rw-rw- myself/user 42 May 21 13:29 1990 practice/blues -rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk -rw-rw-rw- myself/user 40 May 21 13:30 1990 practice/jazz -rw-rw-rw- myself/user 10240 May 31 21:49 1990 practice/records %
Заметьте, что когда вы используете вместе '--verbose' и '--list', tar не выдает имена файлов, а при использовании '--verbose' в сочетании со всеми другими операциями этот эффект наблюдается.

Занесение заданного файла в архив *

Чтобы узнать, находится ли определенный файл в архиве, задайте имя файла. Например, если вы хотите проверить, находится ли файл 'folk' в архивном файле 'music', вы:

Наберите:

% tar --list --file=music practice/folk
tar ответит:

practice /folk
Если бы файла не было в архиве (как, например, файла 'practice/rock'), предыдущий пример выглядел бы следующим образом:

% tar --list --file=music practice/rock tar: practice/rock не найден в архиве
Опция '--verbose' не оказывает никакого влияния на выполнение операции '--list', если вы задали аргументы имени файла.

Чтобы узнать, содержится ли конкретный файл в архиве, используйте имя файла. Например, чтобы проверить, содержится ли файл 'folk' в архивном файле 'music', проделайте следующее:

Наберите:

% tar --list --file=music practice/folk
tar ответит:

practice/folk
Если бы файлы не хранились в архиве (как, например, файл 'practice/folk), вышеприведенный пример выглядел бы следующим образом:

% tar --list --file=music practice/rock tar: practice/rock not found in archive
Ели бы вы использовали '--verbose' ('-v'), пример выглядел бы следующим образом:

% tar --list --file=music practice/folk -rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk

Перечисление содержимого сохраненного каталога *

Чтобы получить информацию о содержимом заархивированного каталога, используется имя каталога как аргумент имени файла в сочетании с '--list'. Чтобы узнать атрибуты файлов, включите опцию '--verbose'.

Например, чтобы чтобы узнать о файла в каталоге 'practice' в архивном файле 'music', наберите:

% tar --list --file=music practice
tar ответит:

drwxrwxrwx myself/user 0 May 31 21:49 1990 practice/ -rw-rw-rw- myself/user 42 May 21 13:29 1990 practice/blues -rw-rw-rw- myself/user 62 May 23 10:55 1990 practice/folk -rw-rw-rw- myself/user 40 May 21 13:30 1990 practice/jazz -rw-rw-rw- myself/user 10240 May 31 21:49 1990 practice/records
Когда вы используете имя каталога как аргумент имени файла, tar имеет дело со всеми файлами (включая файлы подкаталогов) этого каталога.

2.3 Как извлекать из архива его члены *

Для того, чтобы извлечь члены из архива, используется опция '--extract' ('-x'). Задайте имя архива с помощью '--file=имя_архива' ('-f имя_архива'). Чтобы извлечь члены заданного архива, задайте их имена членов как аргументы. Естественно дать им их точные имена членов, как введенные с помощью '--list' ('-t'). Это создаст копию члена архива с тем же именем файла, что и его имя в архиве.

В примере с двумя архивами, созданными в начале этого введения, 'tar --extract --file=afiles.tar apple' в текущем каталоге создастся файл 'apple' c содержимым архивного файла 'apple'. Любой уже существующий файл с именем 'apple' уничтожится, но это не изменит архива.

Очень важно задавать точные имена членов. Команда 'tar --extract --file=briles.tar baloons' будет ошибочна, т.к. нет члена с именем 'baloons'. Чтобы извлечь член с именем './baloons', вы должны набрать 'tar --extract --file=bfiles.tar ./baloons'. Чтобы узнать точные имена членов архива, используйте '--list' ('-t').

Если вы не перечисляете имен членов архива, '--extract' извлечет имена всех членов архива.

Если вы даете опцию '--verbose', то '--extract' напечатает имена членов архива, которые только что извлек .

Извлечение файлов из архива в ваш текущий каталог *

Очевидно, что конечная цель пользователей tar - получить свои файлы обратно. Чтобы это сделать, используйте операцию '--extract' или '--get'. '--extract' ('-x') может использоваться для извлечения отдельного файла из архива или для того, чтобы записать все файлы архива обратно в систему файлов.

В предыдущем примере вы конкатенировали два архива: 'music' и 'practice/records'. Теперь, чтобы извлечь полное содержание 'music' (выходной файл процесса конкатенации), вы должны, находясь в домашнем каталоге:

% tar --extract --file=music tar: Could not make directory practice : File exists
Т.к. файлы, хранящиеся изначально в 'music', хранились как файлы подкаталога (а не как файлы рабочего каталога), они хранятся в архиве с ведущим именем каталога - tar при их обновлении пытался создать заново этот каталог и получил ошибку: этот каталог уже существует. Однако извлечение не было прекращено. Если вы производите переход в каталог 'practice' и генерируете список каталога, вы получаете, что 'jazz', который мы перемещали в более ранний каталог, восстановлен.

% cd practice % ls blues classical folk jazz records rock
Однако, если вы более строго просмотрите файлы каталога, вы получите, что файлы 'blues' и 'folk' - фактически начальные версии файла, который хранился в 'music' в начале введения. tar при извлечении файлов из 'music' перезаписал существующий файл в систему файлов.

Т.к. более новые версии файлов хранились в 'records' выше, их нельзя больше оттуда извлечь. 'records' тоже был заархивирован tar, когда каталог 'practice' хранился в архивном файле 'music' и был обновлен, когда файлы в 'practice' были перезаписаны. Однако более новая версия 'records' была связана с 'music'. Содержание более новой версии 'records', следовательно, будет извлечено, когда будут извлечены все файлы 'music'. Последние извлечены. tar сохранил их заново в рабочем каталоге, используя имена, под которыми они изначально хранились. Поскольку изначально они хранились как часть 'records', в каталоге 'practice', у них нет предшествующего каталога, хранящегося как часть их имен. Для того, чтобы найти последние версии 'blues', 'folk', 'jazz', 'rock' и 'classical', посмотрите в вашем домашнем каталоге.

Вы можете захотеть обновить файлы в вашем каталоге 'practice' перед извлечением их из 'music'. Вместо того, чтобы перемещать файлы из вашего домашнего каталога в подкаталог 'practice', вы можете выполнить такое же извлечение, как в предыдущем примере, используя каталог 'practice' в качестве вашего домашнего каталога:

% cd practice % tar --extract --verbose --file=~/music practice/ practice/blues practice/folk practice/jazz practice/records blues folk jazz blues rock blues classical %
Если вы теперь проверите файлы в практическом каталоге, вы найдете, что они обновили свое состояние. Старые версии файлов, которые хранились в 'music' с предыдущим именем каталога, записаны в новосозданный подкаталог рабочего каталога (ваш подкаталог 'practice'). Новый каталог также называется 'practice'.

Извлечение файлов из архива *

Cоздание архива - только половина дела: нет смысла хранить файлы в архиве, если потом нельзя их извлечь. Чтобы извлечь файлы из архива, используется операция '--extract' ('-x').

Чтобы извлечь заданные файлы, используют из имена как аргументы имени файла. Если вы используете имя каталога как аргумент имени файла, tar извлекает все файлы (включая подкаталоги) этого каталога. Если вы не используете аргументы имени файла, tar извлекает все файлы архива.

Заметьте: tar извлекает член архива в систему файлов без проверки, не существует ли уже файл с таким именем члена архива. Если он уже существует, его содержание уничтожится, т.к. tar запишет на его место другой файл.

Извлечение заданных файлов *

Чтобы извлечь определенные файлы, задайте их, используя аргументы имени файла.

В вышеприведенном примере вы создали архивный файл '~/practice/records', содержащий файлы 'blues', 'folk' и 'jazz' в каталоге 'practice'. Если по какой-то причине вы лишились одного из этих текстовых файлов (rm ~/practice/blues'), вы можете извлечь его из архивного файла.

В первую очередь перейдите в каталог 'practice'. Затем:

% tar --extract --file=records blues
Если вы посмотрите список содержимого каталога, вы увидите, что 'blues' стоит последним:

% ls folk jazz records blues

Извлечение каталогов *

Чтобы извлечь каталог и все файлы, которые он содержит, используется имя каталога как аргумент имени файла в сочетании с 'tar + extract'. Помните: tar хранит и извлекает файлы с именами, относящимися к рабочему каталогу.

В предыдущем примере вы хранили каталог '~/practice' в архивном файле '~/music'. Если вы уничтожили содержание 'practice', вы можете восстановить его.

В первую очередь перейдите в подкаталог 'practice' ('cd ~/practice'). Затем удалите все файлы в '~/practice'('rm*'). Если вы теперь посмотрите список каталога, то увидите, что он пустой:

% ls %
Теперь давайте попытаемся восстановить содержание 'practice' с помещью извлечения его из архивного файла '~/music':

tar --extract --file=~/music practice
Теперь опять посмотрим содержимое 'practice':

% ls practice
Что случилось с файлами? Когда вы создавали '~/music', вашим рабочим каталогом был ваш домашний каталог. Когда вы извлекали '~/music', вашим рабочим каталогом был '~/practice'. tar хранил файлы в 'practice', соответствующем вашему домашнему каталогу, а затем извлек их. Сейчас файлы в новом каталоге по имени '~/practice/practice'.

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

% rm ~/practice/practice/* %rmdir practice % cd % tar --extract --file=music practice
(tar сообщит, что он не может создать каталог '~/practice', потому что он уже существует. И извлечение других членов архива работать не будет.)

2.4 Как добавлять файлы в уже существующие архивы *

Если вы хотите добавить файлы в существующий архив, нельзя использовать '--create'('-c'). Эта опция уничтожит архив и создаст новый на его месте. Вместо этого используется '--append' ('-r'). Команда 'tar --append --file=afiles.tar arbalest' добавит 'arbalest' в существующий архив 'afiles.tar'. При использовании '--append' архив должен уже существовать.

Как и с помощью '--create', нооводобавленные файлы могут быть извлечены так же, как если бы их имена как членов архива были даны на командной строке. Опция '--verbose' выведет имена файлов в том порядке, как они были записаны в архив.

Если вы '--append' добавляете в архив файл под именем, которое уже имеет один из членов архива, старый член не уничтожается. Но происходит, однако, довольно сложный процесс.

Если вы хотите уничтожить член архива, используйте сначала '--delete', а затем '--append'.

Вместо того, чтобы создавать новый архив кажадый раз, когда вы хотите сохранить файл, иногда более целесообразно добавлять файлы в уже существующий архив.

Чтобы добавить файл в уже существующий архив, используйте операцию '--append'. Чтобы записать новые версии членов архива в архив, используйте операцию '--update' ('-u').

Если вы используете tar для создания архива целого каталога или каталогового дерева, более разумно, когда резервное копирование производится только для тех файлов архивов, которые недавно созданы или изменялись в процессе последнего резервного копирования.

Ччобы добавить новые файлы в существующий архив, или добавить новые версии старых файлов, вы можете использовать операцию '--append' или '--update'.

Запись файлов в архив *

Простейший способ добавить файлы в уже существующий архив - операция '--append' ('-r'), которая записывает заданные файлы в архив, безотносительно к тому, существуют ли они уже среди файлов архива. Когда вы используете '--append', вы обязательно должны задать аргументы имени файла, т.к. по умолчанию они не задаются. Если вы задаете файл, уже существующий в архиве, другая его копия добавляется в конец архива.

В одном из вышеприведенных примеров вы создавали в каталоге файл по имени 'rock', которого не существовало ни в архивном файле 'records' практического каталога, ни в архивном файле 'music' рабочего каталога. Чтобы добавить 'rock' в 'records', вы должны, находясь в практическом каталоге:

% tar --append --file=records rock
Если вы теперь воспользуетесь операцией '--list', вы увидите, что 'rock' появился в архиве:

% tar --list --file=records blues folk jazz rock
Хотя все новосозданные файлы добавились в 'records', он еще не является текущим относительно содержимого практического каталога. Если обратиться к предыдущему примеру, использовавшему '--compare; - 'blues' был изменен, после того как был создан архив 'create'. Однако для решения проблемы очень просто использовать '--append':

% tar --append --verbose --file=records blues blues
Т.к. вы задали опцию '--verbose', tar сразу напечатал имя добавленного файла. Если вы сейчас используете опцию '--list' для получения содержимого архива, вы увидите следующее:

% tar --list -f records blues folk jazz rock blues
Новейшая версия 'blues' сейчас в конце архива. Т.к. файлы извлекаются из архива в том порядке, в котором они там появились, и т.к. извлеченные файлы даны в системе файлов под теми же именами, что и те, под которыми они хранились в архиве, когда извлечены файлы 'records', новая версия 'blues' (которая имеет то же имя, что и старая) запишется на версию, которая была записана первой.

Простейший способ добавить файл в уже существующий архив - операция '--append' ('-r'), которая записывает файлы в архив безотносительно к тому, являются ли они уже членами архива. Когда вы используете '--append', вы обязаны использовать аргументы имени файла. Если вы задаете файл, уже хранящийся в архиве, tar добавляет в архив другую копию файла.

Если вы прорабатывали предыдущие примеры, у вас должен быть текстовый файл по имени '~/practice/rock', который не хранится ни в архивном файле '~/practice/records', ни в архивном файле 'music'. Чтобы добавить 'rock' в 'records', сначала сделайте 'practice' рабочим каталогом ('cd practice'). Затем:

Например:

% tar --append --file=records blues folk jazz rock

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

Если вы вспомните предыдущий пример, использовавший '--compare', 'blues' был изменен после того, как был создан архив 'records'. Однако проще использовать '--append' для того, чтобы добавить новую версию 'blues' в 'records'.

% tar --list -f records blues
Если вы теперь посмотрите список содержимого архива, вы увидите следующее:

% tar --list -f records blues folk jazz rock blues
Новейшая версия 'blues' - в конце архива. При извлечении файлов 'records' из архива более новая версия 'blues' (имеющая то же имя, что и старая), запишется на версию, сохраненную первой. Когда заканчивается выполнение 'extract', в системе файлов находится только более новая версия 'blues'.

Модифицированные файлы в архиве *

Поскольку опция '--append' используется для модифицированных файлов в архиве, для сохранения архива текущим вы должны сначала использовать опции '--compare' ('-d') или '--list' ('-t') для того, чтобы определить, какие файлы были изменены (или намереваться занять пространство путем добавления идентичных копий архивных файлов в конец архива). Проще использовать операцию '--update' и заставить tar работать за вас.

Опция '--update' ('-u') заставляет tar добавлять файлы в коней архива, так же, как опция '--append' ('-r'). Когда вы вызываете tar c помощью задания опции '--update', вы должны задать аргументы имени файла. В отличие от '--append', '--update' заставляет tar проверять архив, подлежащий модификации, на тот предмет, сохранен ли уже задаваемый файл. Если файл (или что-то с тем же именем) уже в архиве, tar cмотрит дату модификации его в архиве и сравнивает ее с датой модификации файла с тем же именем в системе файлов. Файл заносится в архив только если он новый или дата его модификации была изменена на более позднюю.

Чтобы увидеть опцию '--update' в рвботе, создайте новый файл, 'classical', в вашем практическом каталоге, и добавьте строку в файл 'blues', используя текстовый редактор. Затем вызовите tar с помощью операции '--update' ('-u') и опции '--verbose', используя имена всех файлов в практическом каталоге как аргументы имени файла:

% tar --update --verbose --file=records blues folk rock classical blues classical %
Т.к. мы задали командный режим, tar печатает имена файлов, с которыми он работает, которые в данном случае являются именами файлов, которые нужно модифицировать. Если вы теперь вызовете tar и зададите операцию '--list' для генерации списка файлов архива, вы увидите, что 'blues' и 'classical' добавлены в конец.

[tar не записывает новую версию на старую, т.к. запись в середину участка ленты - трудный процесс. Ленты не расчитаны на возвращение по ним назад. Даже если бы это было возможно, представьте, что бы было, если бы новая версия оказалась длиннее старой...].

Для поддержания членов архива с помощью их противоположных частей с теми же именами в системе файлов используйте опцию '--update' ('-u'). Она добавит заданный файл в архив, если в архиве еще нет файла с таким именем. Если в архиве уже есть файл с таким именем, tar смотрит дату модификации члена архива, и добавляет фай, только если он был модифицирован позже. Если файл хранится в архиве, но уже не существует под таким именем в системе файлов, tar сообщает об ошибке.

Вы можете использовать опцию '--append' ('-r') для поддержания архива текущим, но при этом вы должны или использовать опции '--compare' и '--list' для определения, какие файлы нуждаются в реархивации (которая может занять много времени), или добавить идентичные копии уже существующих файлов в архив (которые могут занять много места).

При операции '--update' вы обязаны использовать аргументы имени файла.

Для того, чтобы увидеть опцию '--update' в работе, создайте новый файл '~/practice/classical' и модифицируйте файл '~/practice/blues' (и для того, и для другого вы можете использовать текстовый редактор, такой как Emacs). Затем, используя 'practice' в качестве вашего домашнего каталога, вызовите tar опцией '--update', используя имена всех файлов практического каталога как аргументы имени файла, и задав опцию '--verbose':

% tar --update --verbose --file=records blues folk rock classical blues classical %
Т.к. вы задали словесный режим, tar печатает имена файлов, с которыми он работает. Если вы теперь посмотрите список членов архива ('tar --list --file=records'), вы увидите, что в 'records' добавились файл 'classical' и другая версия файла 'blues'.

Заметьте: когда вы модифицируете архив, tar не записывает более новые версии файлов на старые члены архива - он хранит их отдельно. Это потому, что члены архива возникают в нем в том порядке, в котором они хранятся, и некоторые архивные устройства не позволяют запись в середину архива.

Конкатенация архивов *

Иногда, вместо того, чтобы добавлять отдельные файлы в конец архива, бывает более удобно добавлять сами архивы в конец архива. Хотя интуитивно для этой цели хочется использовать cat, утилиту для добавления файлов в совокупности, архивы, созданные tar, помечаются на конце файловым маркером, который уничтожается, если конкатенированные архивы должны читаться как один архив.

Таким образом,чтобы добавить архивы к концу другого архива, вы должны использовать операцию '--concatenate' ('-A').

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

% cd.. % tar --concatenate --file=music practice/records
Прежде чем посмотреть новое содержание 'music', давайте извлечем все файлы, чтобы увидеть, что произошло.

Чтобы конкатенировать архивные файлы, используйте опцию '--concatenate' ('-A'). Эта операция добавляет другие архивы в конец архива. Хотя интуитивно для этой цели хочется использовать cat, утилиту для добавления файлов в совокупности, архивы, сложенные вместе, не могут быть прочитаны tar. Архивные файлы помечаются на конце файловым маркером: если архивы конкатенированы с помощью cat, этот маркер появится перед концом нового архива. Это будет препятствовать операциям с этим архивом.

В более ранних примерах вы хранили каталог '~/practice' в архивном файле '~/music'. Если вы следили за примерами, у вас с тех пор изменилось содержание каталога '~/practice'. Эти текущие версии файлов каталога 'practice', однако, хранятся в архивном файле '~/practice/records'.

Чтобы сохранить текущие версии файлов 'practice' в архивном файле 'music', вы можете использовать '--concatenate' ('-A') для добавления архивного файла '~/practice/records' к 'music'. В первую очередь убедитесь, что вы находитесь в вашем домашнем каталоге ('cd~'). Затем:

% cd ~ % tar --concatenate --file=music practice/records
Если вы теперь посмотрите содержимое 'music', вы увидите члены архива 'practice/records':

% tar --list--file=music blues folk jazz rock blues practice/blues practice/folk practice/jazz practice/rock practice/blues practice/classical

2.5 Как удалить из архива его члены *

Вы можете удалить из архива его члены с помощью '--delete'. Задайте имя архива с помощью '--file=имя_архива'. Введите список имен членов, подлежащих удалению. (Если вы не укажете эти имена, ничего не удалится.) Опция '--verbose' заставляет tar печатать имена членов после их удаления. Так же, как при использовании '--extract', важно, чтобы вы дали точные имена членов. Для того, чтобы узнать точные имена членов архива, используйте '--list'.

Опция '--delete' работает только с архивами, хранящимися на диске. Вы не можете удалить члены из архива, хранящегося на ленте.

В некоторых случаях удобно удалять файлы из архива, хранящегося на диске (но никогда не бывает удобно удалять файлы из архива, хранящегося на ленте: из-за строчной природы записи на ленту этот процесс похож на шифрование архива). Вы можете использовать операцию '--delete' для удаления файлов из архива. Имена файлов, подлежащих удалению, должны быть заданы как аргументы имени файла. Все версии названных файлов удаляются из архива. Выполнение операции '--delete' может быть очень медленным.

Чтобы уничтожить все версии файла 'blues' из архива 'records' каталога 'practice', убедитесь, что вы находитесь в этом каталоге, а затем

% tar --list --file=records blues folk jazz % tar --delete --file=records blues % tar --list --file=records folk jazz %
В некоторых случаях вы можете захотеть удалить определенные файлы из архива, хранящегося на диске.

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

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

Выполнение операции '--delete' может быть очень медленным.

Чтобы уничтожить все версии файла 'blues' из архива 'records' каталога 'practice', убедитесь, что вы находитесь в этом каталоге, а затем

% tar --list --file=records blues folk jazz % tar --delete --file=records blues % tar --list --file=records folk jazz %


Вперед Назад Содержание