Добавить в цитаты Настройки чтения

Страница 56 из 113



[[email protected]/* */ ~]$ sudo tar cf /media/BigDisk/home.tar /home

После записи файла следует отмонтировать диск и подключить его ко второму компьютеру. И снова он автоматически монтируется в каталог /media/BigDisk. Чтобы извлечь архив, выполните следующие команды:

[[email protected]/* */ ~]$ cd /

[[email protected]/* */ /]$ sudo tar xf /media/BigDisk/home.tar

Обратите внимание, что здесь сначала выполняется переход в каталог /, чтобы извлечение производилось относительно корневого каталога, потому что все пути в архиве — относительные.

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

tar xf archive.tar путь_к_файлу

Добавление в конец команды пути к файлу гарантирует извлечение только этого файла. Можно указать несколько путей. Обратите внимание, что путь к файлу должен быть полным относительным путем в архиве. Обычно в путях к файлам нельзя использовать групповые символы; но GNU-версия tar (именно эта версия входит в состав большинства дистрибутивов Linux) поддерживает параметр --wildcards. В следующем примере используется файл playground2.tar, созданный выше:

[[email protected]/* */ ~]$ cd foo

[[email protected]/* */ foo]$ tar xf ../playground2.tar --wildcards 'home/me/playground/ dir-*/file-A'

Эта команда извлечет только файлы, соответствующие указанному пути с групповым символом dir-*.

Программа tar часто используется в сочетании с find. В следующем примере коман­да find используется для поиска файлов, подлежащих включению в архив:

[[email protected]/* */ ~]$ find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'

Здесь команда find отыскивает в каталоге playground все файлы с именем file-A и затем с помощью операции -exec вызывает tar в режиме добавления в конец (r), чтобы добавить найденные файлы в архив playground.tar.

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

Программа tar способна также использовать стандартный ввод и стандартный вывод. Например:

[[email protected]/* */ foo]$ cd

[[email protected]/* */ ~]$ find playground -name 'file-A' | tar cf - --files-from=- | gzip > playground.tgz

Здесь программа find создает список файлов и передает его по конвейеру программе tar. Когда программе tar передается имя файла - (дефис), под ним подразу­мевается стандартный ввод или стандартный вывод, в зависимости от контекста. (Кстати, соглашение об использовании дефиса (-) для представления стандартного ввода/вывода используется также многими другими программами.) Параметр --files-from (который можно заменить эквивалентным параметром -T) заставляет tar читать список путей из файла, а не из командной строки. Наконец, архив, произведенный программой tar, передается по конвейеру программе gzip, чтобы в результате получить сжатый архив playground.tgz. Расширение .tgz по общепринятому соглашению используется для tar-архивов, сжатых программой gzip. В некоторых случаях используется расширение .tar.gz.

В примере, приведенном выше, для сжатия архива использовалась внешняя программа gzip, однако современные GNU-версии tar поддерживают возможность gzip- и bzip2-сжатия своими встроенными средствами, для чего служат параметры z и j соответственно. Взяв за основу предыдущий пример, его можно упростить, как показано ниже:

[[email protected]/* */ ~]$ find playground -name 'file-A' | tar czf playground.tgz -T -

Если, напротив, понадобится создать архив, сжатый в формате bzip2, это можно сделать так:

[[email protected]/* */ ~]$ find playground -name 'file-A' | tar cjf playground.tbz -T -

Произведя простую замену параметра сжатия z на j (и изменив расширение выходного файла на .tbz, указывающее, что для сжатия использовался алгоритм bzip2), мы задействовали bzip2-сжатие.

Другой интересный пример использования поддержки стандартного ввода и вывода командой tar связан с передачей файлов между системами по сети. Представьте, что имеется две машины, действующие под управлением Unix-подобных систем и имеющие программы tar и ssh. В этом случае можно организовать передачу каталога из удаленной системы (с именем remote-sys в этом примере) в локальную:

[[email protected]/* */ ~]$ mkdir remote-stuff



[[email protected]/* */ ~]$ cd remote-stuff

[[email protected]/* */ remote-stuff]$ ssh remote-sys 'tar cf - Documents' | tar xf -

[email protected]/* */'s password:

[[email protected]/* */ remote-stuff]$ ls

Documents

Здесь мы скопировали каталог Documents из удаленной системы remote-sys в каталог с именем remote-stuff в локальной системе. Как это получилось? Во-первых, мы запустили программу tar в удаленной системе с помощью команды ssh. Как вы наверняка помните, ssh позволяет выполнить программу на удаленном компьютере в сети и «увидеть» результат в локальной системе — стандартный вывод, полученный в удаленной системе, пересылается в локальную систему для обзора. Мы воспользовались этой особенностью и заставили tar создать архив (режим c) и вывести его не в файл, а в стандартный вывод (параметр f с дефисом в качестве аргумента), вследствие чего архив передается через шифрованный туннель, созданный программой ssh, локальной системе. В локальной системе мы вызвали tar с целью распаковать архив (режим x), полученный со стандартного ввода (все тот же параметр f с дефисом в качестве аргумента).

zip — упаковывание и сжатие файлов

Программа zip одновременно является и инструментом сжатия, и архиватором. Формат файлов, используемый программой, знаком пользователям Windows — программа читает и создает файлы с расширением .zip. Однако в Linux чаще других используется программа сжатия gzip, а второе место занимает bzip2. Пользователи Linux используют zip в основном для обмена файлами с системами Windows, а не как основной инструмент сжатия и архивирования.

В простейшем случае программа zip имеет следующий синтаксис:

zip параметры сжатый_файл файл...

Например, ниже показано, как создать zip-архив нашей песочницы:

[[email protected]/* */ ~]$ zip -r playground.zip playground

Без параметра -r (отвечает за рекурсивный обход каталогов) в архив будет включен только каталог playground (без своего содержимого). Расширение .zip добавляется к имени выходного файла автоматически, а мы включили его в пример для наглядности.

В процессе создания zip-архива программа zip обычно выводит последовательность сообщений, как показано ниже:

adding: playground/dir-020/file-Z (stored 0%)

adding: playground/dir-020/file-Y (stored 0%)

adding: playground/dir-020/file-X (stored 0%)

adding: playground/dir-087/ (stored 0%)

adding: playground/dir-087/file-S (stored 0%)

Эти сообщения показывают состояние каждого файла, добавленного в архив. zip добавляет файлы в архив, используя один из двух методов: либо «store» (простое сохранение) — без сжатия, как в примере, приведенном выше, либо «deflate» — со сжатием. Числовое значение, следующее за названием метода добавления, указывает достигнутую степень сжатия. Поскольку в нашей песочнице хранятся только пустые файлы, сжатие их содержимого не производится.

Извлечение содержимого из zip-архива выполняется просто — с помощью программы unzip:

[[email protected]/* */ ~]$ cd foo

[[email protected]/* */ foo]$ unzip ../playground.zip

Одно важное отличие zip (от tar) состоит в том, что если указанный архив существует, он дополняется, а не замещается. То есть существующий архив сохраняется, новые файлы добавляются в него, а существующие — замещаются.