Создание и распаковка 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