Перейти к содержанию

Создание и распаковка tar архивов в Linux

Создание и распаковка архивов

Рассмотрим общий синтаксис для создания и распаковки архивов.

Создать

Создание выполняется с ключом c. Синтаксис следующий:

tar -c<опции> <новый архивный файл> <что сжимаем>

Пример создания:

tar -czvf archive.tar.gz /home/dmosk
  • в данном примере будет создан архив archive.tar.gz домашней директории пользователя (/home/dmosk) ** где
  • z — сжать архив в gzip (без этого параметра, tar не сжимает, а создает так называемый тарбол);
  • c — ключ на создание архива;
  • v — verbose режим, то есть с выводом на экран процесса (очень удобно для наблюдением за ходом работы, но в скриптах можно упустить);
  • f — использовать файл (обязательно указываем, так как в большей степени работаем именно с файлами).

Распаковать

Распаковка выполняется с ключом x с синтаксисом:

tar -x<опции> <архивный файл>

Пример распаковки:

tar -xvf archive.tar.gz

Форматы

Утилита tar позволяет работать с архивами различных форматов. Рассмотрим их кратко.

gz

Сжатие:

tar -cf archive.tar.gz /files

Распаковка .gz файла:

tar -xf archive.tar.gz
  • при возникновении ошибки This does not look like a tar archive, можно воспользоваться командой gzip -d archive.tar.gz.

bz2

tar -xvjf archive.tar.bz2
  • ключ j отвечает за работу с bz2.

Если система ругается на bzip2, значит нужно его установить:

yum install bzip2
apt-get install bzip2
pkg install bzip2
  • соответственно, для CentOS (RPM based), Ubuntu (deb based), FreeBSD (BSD based).

Если видим ошибку tar: Unrecognized archive format, воспользуемся следующей командой:

bzip2 -d archive.tar.bz2

gzip

tar -xvzf archive.tar.gzip
  • ключ z отвечает за работу с gzip.

tgz

TGZ — tar-архив, сжатый с помощью утилиты gzip. По сути, это тот же tar.gz, и работа с ним ведется такими же командами.

Рассмотрим примеры работы с данным форматом.

Для создания архива tgz выполняем:

tar -czf archive.tgz /files

Распаковывается, как gzip:

tar -xzf archive.tgz

xz

Это формат сжатия данных с помощью алгоритма LZMA. Для работы с ним устанавливаем:

apt install xz-utils
  • на Debian / Ubuntu.
yum install xz
  • на Rocky Linux / CentOS.

Теперь можно пользоваться.

Создать архив:

tar -cpJf archive.tar.xz /home/user

Распаковка:

tar -xpJf archive.tar.xz

Описание ключей tar

  • -A Добавление файлов в архив.
  • -c Создание нового архивного файла.
  • -d Показать отличающиеся данные между каталогом-исходником и содержимым архива.
  • --delete Удалить файлы внутри архива.
  • -r Добавить файлы в конец архива.
  • -t Показать содержимое архива.
  • -u Добавить файлы, которых нет в архиве.
  • -x Извлечь файлы из архива.

нельзя использовать несколько вышеперечисленных ключей в одной команде.

Дополнительные опции

  • --atime-preserve Оставить прежнюю метку времени доступа для файла.
  • -b N Задать размер блока N x 512.
  • -C Смена каталога. По умолчанию, используется тот, в котором мы находимся.
  • --checkpoint Показать имена папок при чтении архивного файла.
  • -G Использование старого формата инкрементального резервирования при отображении или извлечения.
  • -g Использование нового формата инкрементального резервирования при отображении или извлечения.
  • -h Не дублировать символьные ссылки. Только файлы, на которые указывают эти симлинки.
  • -i Игнорировать блоки нулей.
  • -j Использование bzip2.
  • --ignore-failed-read Игнорировать не читаемые файлы.
  • -k При распаковке, существующие файлы не заменяются соответствующими файлами из архива.
  • -L N Смена магнитной ленты после N*1024 байт.
  • -m При извлечении игнорировать время модификации объекта.
  • -M Многотомные архивы.
  • -N DATE Сохранять только более новые файлы относительно DATE
  • -O Направление извлекаемого на стандартный вывод.
  • -p Извлечение защищенной информации.
  • -P Не отбрасывает начальный слэш (/) из имен.
  • -s Сортировка файлов при извлечении.
  • --preserve Аналогично -ps
  • --remove-files Удалить исходные файлы после добавления в архив.
  • --same-owner Сохранить владельца при извлечении.
  • --totals Вывод байт при создании архива.
  • -v Протоколирование действий — отображение списка объектов, над которыми происходит действие.
  • -V NAME Создание архива на томе с меткой NAME.
  • --version Показать версию tar.
  • -w Требовать подтверждения для каждого действия.
  • -W Проверка архива после записи.
  • --exclude FILE Исключить файл FILE.
  • -X FILE Исключить файлы FILE.
  • -Z Фильтрует архив с помощью compress.
  • -z Использование gzip.

актуальный список опций можно получить командой man tar.

Примеры

Просмотр содержимого архивов .tar, .tar.gz и .tar.bz2

Для просмотра содержимого архива (в нашем случае его имя - archive) , выполните команду:

tar -tf  archive.tar
tar -ztf archive.tar.gz
tar -jtf archive.tar.bz2

если он содержит большое количество файлов, то вполне разумно употребить команду less, которая позволит выполнить постраничный вывод информации на экран:

tar -tf archive.tar | less
tar -ztf archive.tar.gz | less
tar -jtf archive.tar.bz2 | less

Вы также можете использовать утилиту grep вместо less - это позволит вам отыскать тот или иной файл в архиве. Допустим:

tar -ztf archive.tar.gz | grep convert.py

Создать архив из папки

Предположим, что необходимо создать tar архив из папки и использовать при этом сжатие. Чтобы создать архив tar с gzip сжатием, нужно выполнить команду:

tar -zcf /root/files.tar.gz /home/folder/
При выполнении этой команды из содержимого папки /home/folder/ будет создан архив по адресу /root/files.tar.gz. Если указать относительный путь, то файл создастся в той папке, где открыт терминал.

В конце команды передаётся директория, которую надо архивировать. В примере стоит абсолютный путь к этой папке. В таком случае в архиве tar будет находится все родительские папки т.е. при открытии архива там будет папка /home/ и внутри неё папка /folder/. Но если абсолютный путь заменить относительным, то будет только /folder/. В названии файла "files.tar.gz" можно указать любое расширение. Но для сжатых тарболлов лучше писать именно так. То есть сначала указывать то что это "tar", а потом писать "gz".

Разберём пример по частям. Команда tar в примере выше имеет три ключа:

  • z - архивирует с gzip компрессией. Если нужно использовать bzip2, надо заменить ключ "z" на "j".
  • c - без этого ключа архив не создастся.
  • f - вывод информация в файл. Без этого ключа tar будет выдавать результат на stdout при упаковке и пытаться читать архив с stdin при распаковке.

Исключить папки и файлы при создании архива

Иногда нужно исключить некоторые подпапки при создании архива. К примеру, если надо создать архив из папки /home/, но в него не должны попасть содержания папок /cache/ и /trash/. Тогда необходимо использовать ключ exclude:

tar -zcf /root/files.tar.gz /home/ --exclude={'*/cache/*','*/trash/*'}

Символы звёздочек в exclude означают либой набор символов. То есть выполнять эту команду без звёздочек в начале путей, то необходимо прописывать полный путь к папке, которую надо исключить.

В конце значений explude тоже стоят звёздочки, чтобы удалялись не сами папки, а их содержимое (все дочерние файлы и папки).

При выполнении такой команды в архив не попадут файлы из папок:

/home/cache/
/home/folder/cache/
/home/folder/subfolder/cache/

Обратите внимание на то, что внутри фигурных скобок explude нет пробелов {'/cache/','/trash/'}. Если поставить пробел до/после запятой или до/после фигурной скобки, то исключение не сработает.

Разархивировать

Чтобы распаковать содержимое tar архива в ту же папку, в которой он находится, перейдите в папку с ним и введите:

tar -xf files.tar.gz

Ключ x указывает на распаковку архива. Ключ f обязателен, как и при создании архива.

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

tar -xf files.tar.gz -C /home/folder/

Распаковать в определенную папку

tar -C /home/user -xvf archive.tar.gz
  • ключ -C используется для указания папки, куда необходимо распаковать файлы из архива.

Распаковка без вложенной папки

Такой способ можно использовать для распаковки в заранее подготовленный каталог. Будет некий эффект переименовывания каталога или аналог «Распаковать здесь»:

tar -C /home/admin/mytar -xvf admin.tar.gz --strip-components 1
  • каталог /home/admin/mytar заранее должен быть создан; --strip-components 1 пропустит одну вложенную папку внутри архива.

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

tar zxf <путь до архива> <что извлечь>

Рассмотрим пример. Напомним, что можно посмотреть содержимое архива с помощью опции t:

tar tf /backup/samba.tar.gz

Теперь можно распаковать архив:

tar -zxf /backup/samba.tar.gz mail
  • предположим, что внутри архива samba.tar.gz есть что-то и каталог mail. Извлечем мы только последний.

Исключение файлов по маске

Если необходимо пропустить некоторые файлы, вводим команду с ключом --exclude:

tar --exclude='sess_*' -czvf archive.tar.gz /wwwsite
  • в данном примере мы создадим архив archive.tar.gz, в котором не будет файлов, начинающихся на sess_.

Также можно исключить несколько файлов или папок, добавляя несколько опций exclude:

tar --exclude='/data/recycle' --exclude='*.tmp' -zcf /backup/samba/2021-08-29.tar.gz /data/
  • в данном примере мы исключим папку recycle и файлы, которые заканчиваются на .tmp

Работа с архивами, разбитыми на части

Разбить архив на части может понадобиться по разным причинам — нехватка места на носителе, необходимость отправки файлов по почте и так далее.

Чтобы создать архив, разбитый на части, вводим команду:

tar -zcvf - /root | split -b 100M - root_home.tar.gz
  • данная команда создаст архив каталога /root и разобьет его на части по 100 Мб.

В итоге мы получим, примерно, такую картину:

root_home.tar.gzaa  root_home.tar.gzac  root_home.tar.gzae
root_home.tar.gzag  root_home.tar.gzai  root_home.tar.gzab
root_home.tar.gzad  root_home.tar.gzaf  root_home.tar.gzah

Чтобы собрать архив и восстановить его, вводим команду:

cat root_home.tar.gz* | tar -zxv

Создание tar из отдельных файлов с последующим его архивированием Мы можем собрать файл tar, добавляя по очереди в него файлы, после чего создать сжатый архив. Предположим, у нас 3 файла: file1, file2, file3.

Сначала создадим tar-файл с первым файлом внутри:

tar -cf ./my_archive.tar ./file1

Следующими двумя командами мы добавим в архив файлы file2 и file3:

tar -rf ./my_archive.tar ./file2

tar -rf ./my_archive.tar ./file3

Сожмем содержимое tar-файла:

gzip < ./my_archive.tar > ./my_archive.tar.gz

Файл tar можно удалить:

rm -f my_archive.tar

ZIP

Tar не работает с zip-архивами. В системах UNIX для этого используем утилиты zip и unzip. Для начала, ставим нужные пакеты:

yum install zip unzip

apt-get install zip unzip

pkg install zip unzip
  • соответственно, для RPM based, deb based, BSD based.

Создание ZIP:

zip -r archive.zip /home/dmosk
  • создает архив каталога /home/dmosk в файл archive.zip.

Распаковка ZIP:

unzip archive.zip