Работа с tar архивами

tar - это архиватор от GNU. tar берёт несколько файлов и/или каталогов и объединяет их в один большой файл. Это позволяет вам сжать целое дерево каталогов, что невозможно сделать с помощью Примеры использования gzip и gunzip или bzip2. У tar'а есть много опций, которые подробно описаны на его странице руководства.

$ man tar
 
tar -xvvf foo.tar
              extract foo.tar
 
tar -xvvzf foo.tar.gz
              extract gzipped foo.tar.gz
 
tar -cvvf foo.tar foo/
             tar contents of folder foo in foo.tar
  1. -c – создать (create) новый архив
  2. -x – извлечь (extract) файлы из архива
  3. –delete – удалить (delete) файлы из архива
  4. -r – добавить (append) файлы в существующий архив
  5. -A – добавить (append) tar-файлы в существующий архив
  6. -t – список файлов в архиве (содержимое архива)
  7. -u – обновить (update) архив
  8. -d – операция сравнения архива с заданной файловой системой
  9. -z – обработка архива с помощью Примеры использования gzip и gunzip. Сжатие или разжатие, в зависимости от комбинации сопутствующих ключей -c или -x.
  10. -j – обработка архива с помощью bzip2. Сжатие или разжатие, в зависимости от комбинации сопутствующих ключей -c или -x.
  11. -t, –list – разрешает посмотреть содержимое архива, формат аналогичен ls –l; если файлы не указаны, то выводит информацию обо всех файлах;
tar запускается с обязательным указанием одного из основных действий, самые распространенные из которых - создание и распаковка архивов, далее задаются прочие параметры, зависящие от конкретной операции.

Наиболее общее использование tar заключается в распаковке и разархивировании пакета, загруженного с веб- или ftp-сайта. Большинство файлов имеют расширение .tar.gz. Довольно часто их называют “tarball”'ами. Это означает несколько файлов, заархивированных tar'ом, а затем сжатых gzip'ом. Вы также можете встретить файлы .tar.Z. По сути это то же самое, однако встречаются они в основном на старых системах Unix.

Кроме того вы можете натолкнуться на файлы .tar.bz2. В таком виде распространяются исходные тексты ядра, поскольку так они занимают меньше места для загрузки. Как вы уже наверное догадались, это файлы, заархивированные tar'ом и сжатые bzip'ом.

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

% tar -xvzf файл.tar.gz

Здесь довольно много опций. Что же они означают? Опция -x означает извлечение. Это важно, поскольку она сообщает tar'у, что именно нужно сделать со входным файлом. В данном случае он будет снова разбит на файлы, из которых он был “слеплен”. Опция -v означает включение подробного режима. При этом на экран будут выведены названия всех извлекаемых из архива файлов. Неплохо было бы использовать эту опцию, чтобы распаковка не выглядела слишком скучно. Вы также можете использовать -vv, чтобы вывод был ещё более подробным и вы получили ещё больше информации об извлекаемых файлах. Опция -z сообщает tar'у о том, что файл.tar.gz нужно сначала пропустить через gunzip. И, наконец, опция -f сообщает tar'у, что следующая строка в командной строке - это файл, с которым надо работать.

Существует несколько способов записи этой же команды. На старых системах, на которых отсутствует подходящая копия GNU tar, вы можете увидеть следующую запись этой же команды:

% gunzip файл.tar.gz | tar -xvf -

В этой команде файл сначала распаковывается, а результат отправляется в tar. Т.к. gzip по умолчанию записывает выходные данные на стандартный вывод, эта команда будет записывать распакованный файл на стандартный вывод. Затем конвейер перенаправляет этот поток в tar для распаковки. Знак “-” означает, что данные берутся со стандартного входа. Таким образом команда разархивирует поток данных, полученный из gzip, и запишет его на диск.

Другим способом записи первоначальной команды является убирание знака “-” перед опциями:

% tar xvzf файл.tar.gz

Также вы можете натолкнуться на bzip'нутый архив. Версия tar, представленная в Slackware Linux, может работать с ними точно так же, как и с gzip'нутыми архивами. Просто вместо опции -z вам нужно использовать -j:

% tar -xvjf файл.tar.bz2

Учтите, что tar будет сохранять извлечённые из архива файлы в текущий каталог. Поэтому, если у вас в /tmp есть архив, который вы хотите распаковать в свой домашний каталог, у вас есть несколько вариантов. Первый - архив можно переместить в ваш домашний каталог, а затем развернуть его с помощью tar. Второй - вы можете указать путь к архиву в командной строке. Третий - вы можете использовать опцию -C, чтобы разархивировать тарбол в указанный после этой опции каталог.

% cd $HOME
% cp /tmp/файл.tar.gz .
% tar -xvzf файл.tar.gz
% cd $HOME
% tar -xvzf /tmp/файл.tar.gz
% cd /
% tar -xvzf /tmp/файл.tar.gz -C $HOME

Все приведенные выше записи являются эквивалентными. В каждой из них архив разворачивается в ваш домашний каталог, а исходный сжатый архив остаётся на месте.

Итак, что же хорошего в том, что вы можете распаковывать архивы, если вы не можете создавать их? tar умеет делать и это. В большинстве случаев можно просто заменить опцию “-x” на “-c”.

% tar -cvzf файл.tar.gz .

В этой команде опция -c сообщает tar'у, что нужно создать архив, а опция -z пропускает полученный архив через gzip, чтобы сжать его. файл.tar.gz - это имя создаваемого файла.

Указание опции “-f” не всегда есть обязательным, однако в любом случае лучше её использовать. Без неё tar будет записывать свои данные на стандартный вывод, что обычно используется для перенаправления потока по конвейеру в другую программу, например, так:

% tar -cv файл.tar . | gpg --encrypt

Эта команда создаёт несжатый tar-архив с содержимым текущего каталога, а затем пропускает тарбол через программу gpg, которая шифрует и сжимает архив, делая невозможным его чтение кем-либо, у кого нет вашего секретного ключа.

Если компьютер-источник и целевой компьютер связаны по LAN или WAN, то для экономии времени можно комбинировать использование SSH (Secure Shell) и tar для архивирования, копирования и извлечения файлов за один раз. Вот как это делать:

$ (cd ~/stuff; tar --create --gzip --file - *) | \
ssh destination tar --extract --gunzip --file --verbose -C stuff

В этой команде выполняется сразу несколько действий. Давайте разберем ее:

  1. Последовательность команд, заключенных в круглых скобках, называют вложенной оболочкой - subshell. Изменения, сделанные в subshell-оболочке - например, изменение каталога, - не повлияют на команду в целом, а затронут только среду вложенной оболочки. Поэтому первая управляющая последовательность - (cd ~/stuff; tar –create –gzip –file - *) меняет текущий рабочий каталог на ~/stuff, а затем запускает tar. Так как за вложенной оболочкой следует перенаправление в канал, то все результаты работы subshell посылаются в следующую на очереди команду.
  2. Как и много других UNIX-утилит, tar может писать в стандартный поток вывода (stdout) и читать из стандартного потока ввода (stdin). И stdout и stdin обычно обозначаются дефисом (-). Поэтому команда –create –file - создает архив в stdout.
  3. Канал (|) передает все результаты работы subshell в утилиту ssh, которая, в свою очередь, передает все необходимые данные с исходного компьютера на удаленный.
  4. Наконец, удаленный компьютер запускает собственный экземпляр утилиты tar для извлечения данных из архива. Теперь –extract –file - считывает архив из стандартного потока ввода. Опция -C принуждает tar на целевом компьютере сменить текущий рабочий каталог на stuff, прежде чем начать какие-либо операции разархивирования. Конечным результатом работы этой команды в целом будет передача архива через ssh и распаковка его в ~/stuff.

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

$ ssh destination cat archive.tgz | \
(cd ~/stuff; tar --extract --gunzip --file -)

Архив на удаленном компьютере будет открыт, затем поток байтов из cat будет послан во вложенную оболочку, которая сменит рабочий каталог, а затем извлечет архив. (Добавление -C ~/stuff к команде tar приведет к тем же результатам; пример показывает только то, что subshell тоже могут работать со входными данными.)

tar exclude

–exclude pattern (-W exclude=pattern) Не обрабатывать файлы или директории, которые совпадают с указанным шаблоном. Учтите, что исключения имеют приоритет над шаблонами или именами файлов, указанных в командной строке.

  1. Пример: Из директории test при архивировании tar исключить поддиректорию .svn
    tar -czf test1.tar.gz --exclude=".svn" test/
  2. Пример: При архивировании текущей директории и сжатием gzip, исключить файл с расширениями .tar.gz .iso .deb .py
    $ tar -czf test.tar.gz *.* --exclude="*.tar.gz" --exclude="*.iso" --exclude="folder1" 

tar с сохранением прав доступа

Создать архив с сохранением прав доступа. Ключ -p, –preserve-permissions, –same-permissions извлекать информацию o правах доступа к файлу (по умолчанию для суперпользователя)

tar -cvpf archive.tar.gz dir1

Распаковать архив с сохранением прав доступа

tar -xvpf archive.tar.gz

tar распаковать в нужную директорию

Чтобы распаковать архив в нужную директорию используется ключ -С

# man tar
...
     -C directory
             In c and r mode, this changes the directory before adding the
             following files.  In x mode, change directories after opening the
             archive but before extracting entries from the archive.

...

Например, пример проверен для FreeBSD:

# tar -xvf /usr/home/darkfire/backup.ns.server.254/usr/ports/distfiles.tar -C /usr/ports/

Вариант 1. tar split помогать создать архив разбитый на несколько частей. Минус этого варианта - вам потребуется использовать утилиту cat для сбора архива, перед распаковкой. Ниже полный пример

split -b 1000m distfiles.tar distfiles.split.tar

В итоге вы получите много файликов типа

  distfiles.split.taraa
  distfiles.split.tarab
  distfiles.split.tarai

100m означает 100 мегабайт. Можете написать 100k - это будет 100 киллобайт. Собрать обратно их можно вот так:

cat distfiles.split.tar* | tar zxvf -

Вариант 2. Использование –new-volume-script.

Но мне проще использовать для создания многотомного архива архиватор 7zip.

0 5 * * 1 tar -zcf /home/samba/backup/wikibackup-`date "+%Y-%m-%d"`.tgz /home/www/

Читайте также: Примеры использования gzip и gunzip, zip, Архиватор rar Linux консоль, Работа с архиватором 7zip в консоли.

Для распаковки многотомного архива предварительно необходимо объединить все части в один архив.

В Linyx, FreeBSD это можно сделать с помощью следующей команды:

cat *$(ls -v  *tar.gz*) > backup.tar.gz

Обратите внимание, что эта команда объединит все файлы по маске * tar.gz *, поэтому исправьте маску при необходимости.

PQ VPS сервера в 28+ странах.