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