Осваиваем приёмы работы с Tar-архивами в терминале Linux

debianeach

Опубликован:  2020-02-12T07:07:07.120774Z
Отредактирован:  2020-02-13T04:33:09.723787Z
3700
Работа с архивами в терминале Linux - область задач, вызывающая некоторые затруднения у начинающих пользователей. В этом обзоре Дебианыч расскажет об архиваторе Tar, покажет основные приёмы работы с Tar-архивами в командной строке: создание архива, добавление файлов в существующий архив, сжатие архива, распаковку архива, создание многотомных архивов, защиту архивов паролем etc.

1. Начальные сведения

Архиватор Tar - одна из основополагающих программ операционных систем с ядром Linux и в повседневной практике работы за компьютером используется очень часто. Как правило, одноимённый пакет tar установлен в систему по-умолчанию даже в самом минимальном наборе.

kpHMRCbsKK.png

oUQxC8g3k5.png

Tar достаточно неплохо документирован, в системе есть пакет документации, которую удобно просматривать с помощью программы info, и документацию и программу info при этом придётся установить дополнительно.

2VBzLpARFz.png

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

7q1Axc8uz9.png

Архиватор Tar для операционных систем семейства Linux является родным, обычно говорят - нативным, и отличается от других доступных в системе архиваторов одной важной характерной особенностью: Tar сохраняет атрибуты файлов при извлечении из архива и предоставляет некоторые возможности управлять атрибутами файлов при упаковке архива. Если ваш архив предназначен для распаковки в операционной системе семейства Linux то наилучшим выбором будет архиватор Tar.

Tar не следует использовать, если упакованные в архив файлы/каталоги в своих именах имеют не ASCII-символы, например символы кириллицы, а сам архив предназначен для распаковки в операционных системах семейства MS Windows - в этом случае трудности обеспечены.

Архивы Tar делятся на две основные группы:

  1. Несжатые архивы - отличаются высокой скоростью упаковки и распаковки, поддерживают все возможности архиватора;
  2. Сжатые архивы - обычно сжатие архива Tar реализуется с помощью дополнительной программы - компрессора, естественно для сжатия требуются дополнительные аппаратные ресурсы, и в некоторых случая создание таких архивов может занимать достаточно продолжительное время, при этом сжатые архивы поддерживают не все возможности архиватора.

В связи с этим методология выбора типа архива заключается в определении соотношения количества несжимаемых файлов к количеству всех файлов помещаемых в архив. Например, если вам нужно упаковать пару-тройку mp3-альбомов или альбомов с фотографиями в формате JPEG, то несжатый архив будет наилучшим выбором, так как файлы MP3 и JPEG уже сжаты и практически не поддаются компрессии. Если же вам нужно упаковать в архив большое количество текстовых файлов, то наилучшим выбором будет сжатый архив Tar.

Для сжатия Tar использует внешнюю программу-компрессор, которая должна быть установлена в системе. В Debian buster доступна целая линейка компрессоров: gzip, bzip2, xz, lzip etc. Используемый при упаковке компрессор должен быть установлен в системе, по-умолчанию обычно установлены наиболее популярные gzip и bzip2.

В отличие от других популярных архиваторов: 7z, zip, rar etc., архиватор Tar предназначен только для упаковки файлов и каталогов в архив, все остальные операции с архивом (сжатие, деление на тома, защита паролем и т.п.) обычно выполняются другими узкоспециализированными консольными утилитами. Утилита tar умеет читать stdin и отдавать свой поток данных в stdout, то есть является фильтром, поэтому выполнение дополнительных операций с архивом возможно на лету и без создания временных файлов.

Утилита tar для работы с архивами располагает следующим набором возможных действий:

  • создание архива;
  • добавление дополнительных файлов и каталогов в существующий архив;
  • добавление архива в конец другого архива;
  • получение списка упакованных в архив файлов;
  • сравнение файлов в архиве и файловой системе;
  • удаление файлов из архива;
  • распаковка архива.

Некоторые наиболее часто используемые приёмы работы с утилитой tar Дебианыч продемонстрирует далее по списку ниже...

2. Создание, просмотр и распаковка несжатых архивов Tar

Приступим к конкретным действиям. Для этой демонстрации у меня есть каталог, в котором хранятся основополагающие файлы проекта auriz.ru, а именно дамп базы данных и исходники работающего на стороне сервера web-приложения, всё это добро хранится в одноимённом каталоге в хомяке текущего пользователя.

rOAOiu4uWx.png

Как видно на снимке экрана выше, в текущем каталоге лежит каталог с именем db и размером 410 MiB, а также каталог с именем src и размером 76 MiB. Большинство из хранящихся в этих каталогах файлов являются текстовыми и хорошо поддаются сжатию. Эти два каталога я и буду упаковывать в архив Tar, а потом извлекать. С помощью утилиты time я буду фиксировать время упаковки и время распаковки, когда это необходимо, чтобы сравнить длительность создания и распаковки несжатых и сжатых архивов. И начну я с несжатых архивов.

Наиболее часто в повседневной практике нам нужно упаковать в архив каталог или группу файлов. С утилитой tar это делается элементарно, посмотрим на примере каталога db.

tar -c -f ~/auriz.tar db

Здесь я использовал ключ -c (create), с помощью ключа -f указал имя создаваемого архива, следует обратить внимание, что архив я создаю в домашнем каталоге текущего пользователя, а не в текущем каталоге терминального сеанса, ну и в конце команды я указал каталог, который необходимо добавить в архив. В результате выполненного действия в моём домашнем каталоге появился файл auriz.tar и его размер совсем не отличается от размера каталога db - это видно на снимке экрана ниже.

fVo3EtHICI.png

Случается так, что к уже созданному архиву необходимо добавить какие-то дополнительные файлы и каталоги. Давайте добавим к полученному архиву auriz.tar каталог src.

tar -r -f ~/auriz.tar src

Теперь я задал ключ -r (append), с помощью которого можно добавить к существующему архиву новые файлы и каталоги, с ключом -f указал имя существующего архива и в последнем аргументе указал имя каталога, который необходимо добавить в архив - src. В результате этого действия размер архива увеличился, но не очень сильно отличается от размера упакованных каталогов.

a9hLoaFY0Q.png

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

tar -c -f ~/auriz.tar db src

Кроме этого, с помощью метасимвола * в архив можно упаковать все файлы и каталоги текущего каталога.

tar -c -f ~/auriz.tar *

tb0L5lwVi9.png

Чтобы сравнить время упаковки несжатых и сжатых архивов, можно засечь время упаковки архива с помощью утилиты time, на снимке экрана выше показано создание архива и затраченное на его создание время.

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

tar -t -f ~/auriz.tar | less

XCz8xEQLci.png

Пейджер less позволяет просмотреть содержимое архива полученное от tar, используя прокрутку клавишами со стрелками.

Распаковать несжатый архив Tar так же просто, как и создать, для этого у архиватора есть ключ -x (extract). Для распаковки архива, чтобы не складывать всё в одну кучу, создам новый каталог и войду в него. Команда для распаковки будет выглядеть так:

tar -x -f ~/auriz.tar

При этом файлы из архива будут извлечены в текущий каталог.

UobCxNyQgt.png

На снимке экрана выше можно увидеть время, потребовавшееся на распаковку архива, в результате распаковки в текущем каталоге появились два каталога извлечённые из архива.

Возвращаюсь в каталог ~/auriz, и на этот раз повторим упаковку и распаковку с применением различных компрессоров...

3. Создание и распаковка сжатых архивов Tar

Как известно, для сжатия архива tar использует внешнюю утилиту. В рамках этого обзора я покажу создание архива с применением четырёх различных компрессоров и сравню время, требующееся на упаковку и на распаковку каждого из четырёх архивов. Начнём с самого быстрого и наиболее часто используемого компрессора gzip. Утилита tar даёт возможность автоматически сжать архив с помощью gzip, для этого предназначен ключ -z. Для моих каталогов команда будет выглядеть так.

tar -c -z -f ~/auriz.tar.gz db src

Здесь следует обратить внимание, что к имени создаваемого архива я добавил суффикс .gz, который в принципе не обязателен.

QXc4hmzcMG.png

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

tar -x -z -f ~/auriz.tar.gz

ugNWxKI3uf.png

Второй компрессор bzip2 можно так же просто подключить при создании архива ключом -j.

tar -c -j -f ~/auriz.tar.bz2 db src

nFDc2qO2EV.png

Как видно на снимке экрана выше, bzip2 обеспечивает большую степень сжатия файлов, но при этом создание таких архивов требует большего времени и ресурсов компьютера при прочих равных. Суффикс в конце имени создаваемого архива .bz2 в сущности тоже не обязателен. Распаковать этот архив тоже не составит особого труда.

tar -x -j -f ~/auriz.tar.bz2

p1eXxFjJOk.png

Несложно заметить, что с bzip2 распаковка выполняется быстрей, чем упаковка, но всё же намного медленней, чем распаковка такого же архива, но сжатого gzip.

Третий компрессор - xz позволяет создавать архивы LZMA, его предварительно придётся установить.

sudo apt install -y xz-utils

Создать сжатый этим компрессором архив тоже просто, утилита tar имеет для этого ключ -J.

tar -c -J -f ~/auriz.tar.xz db src

Но времени на создание такого архива потребуется значительно больше при прочих равных, попробуйте не уснуть, пока архив сжимается, особенно если у вашего компьютера слабый процессор и мало оперативной памяти.

UwBpBQzRll.png

Применение этого компрессора обосновано только тогда, когда необходимо упаковать сжимаемые сущности, в этом случае компрессор обеспечивает великолепную степень сжатия, которая, впрочем, достигается серьёзными затратами. Посмотрим на распаковку xz-архива.

tar -x -J -f ~/auriz.tar.xz

OWkAjCGt4b.png

На снимке экрана выше видно, что распаковка xz-сжатого архива происходит намного быстрей, чем упаковка, и даже быстрей, чем распаковка bzip2-сжатого архива.

Последний компрессор, который я хочу рассмотреть в рамках этого обзора - это lzip, его тоже придётся установить дополнительно.

sudo apt install lzip

Все примеры выше при упаковке сжатых архивов компрессорами gzip, bzip2 и xz с соответствующими ключами использовали дефолтную степень сжатия, тем не менее во всех трёх случаях степенью сжатия можно эффективно управлять. Как это делается, я покажу на примере создания lzip-сжатого архива. Для моих подопытных каталогов команда будет выглядеть следующим образом.

tar -c -f ~/auriz.tar.lz -I 'lzip -9' db src

Здесь с помощью ключа -I я задал команду для сжатия архива lzip -9, в которой использовал максимальную степень сжатия. Для справки: команда для создания lzip-сжатого архива с дефолтными настройками выглядела бы несколько иначе:

tar -c --lzip -f ~/auriz.tar.lz db src

Этот компрессор тоже достаточно медленный на упаковке архива и заметно греет процессор, но степень сжатия в сравнении с другими компрессорами впечатляет.

yqXoOwGwCR.png

При выборе lzip компрессора важно правильно оценить соотношение затрат времени и полученной экономии дискового пространства, иногда овчинка не стоит выделки. Распаковка такого типа архивов также элементарна.

tar -x --lzip -f ~/auriz.tar.lz

Mxrw6Vytlk.png

Как видно на снимке экрана, распаковка lzip-сжатых архивов тоже происходит достаточно быстро. Использование этого компрессора обосновано только в определённых случаях.

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

BcSqUI3cjh.png

При распаковке сжатого архива вместо ключей, определяющих тип компрессора, можно использовать ключ -a - автоматическое определение компрессора.

0ee1MHUlUh.png

Как видно на снимке экрана, tar справился с дилеммой и распаковал сжатый архив.

При работе со сжатыми архивами всегда следует помнить, что не все опции tar могут работать в этом режиме, в man-странице архиватора неработающие со сжатыми архивами ключи обычно помечены соответствующей ремаркой.

4. Многотомные архивы

Эпоха флоппи-дисков безвозвратно в прошлом, тем не менее создание многотомных архивов следует рассмотреть, эта фича иногда бывает востребована и сейчас, тем более, что сложного в этом ничего нет. Для создания многотомного архива tar имеется два возможных варианта. Первый вариант - это встроенные функции tar, второй - внешняя утилита split.

Первый вариант работает только с несжатыми архивами, реализуется элементарно, но не очень удобен для оператора компьютера, так как имеет интерактивный режим и требует многократного ввода. Давайте создадим многотомный несжатый архив с размером тома 100MiB на примере всё тех же файлов.

tar -c -M -L 102400 -f auriz1.tar db src

YtlzclKH8C.png

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

tar -x -M -f auriz1.tar

C74ibl507k.png

Не очень удобная фича, Дебианыч согласен.

Второй вариант создания многотомных архивов проще и предлагает более гибкий, автоматизированный процесс. Реализуется он при помощи программного канала и утилиты split.

Для справки: утилита split установлена в систему в составе пакета coreutils.

tar -c -z -f - db src | split -b 100M - auriz.tar.gz.

Здесь для утилиты tar ключ -f использует не имя файла, а знак -, это значит, что создаваемый архив будет транслироваться в stdout. Далее утилита split читает этот поток и создаёт файлы размером 100 MiB каждый с именем auriz.tar.gz. и соответствующим для каждого нового файла суффиксом.

GniVq4BX6z.png

Как видно на снимке экрана, в результате выполнения команды в текущем каталоге появились три новых файла, у каждого файла свой оригинальный суффикс, наличие суффикса делает возможным правильно упорядоченную сортировку. Распаковка такого архива осуществляется тоже с использованием внешней утилиты cat и программного канала.

cat auriz.tar.gz.a* | tar -x -z -f -

mGnhhYboao.png

Как видно на снимке экрана выше, в результате выполнения этой команды в текущем каталоге появились извлечённые из архива каталоги db и src - архив распакован без создания временных файлов.

Второй вариант создания многотомных Tar-архивов намного удобней, он более гибкий и работает с любыми (сжатыми и несжатыми) архивами. Утилита split даёт достаточно широкие возможности, подробности можно почерпнуть в man split.

5. Защита архива паролем

Да, в современном мире очень часто случается, что какие-то конфиденциальные данные приходится передавать заинтересованным получателям при помощи открытых каналов связи. В этом случае защита архива паролем - самый простой вариант предотвратить попадание передаваемых данных случайным пользователям, для которых они не предназначены.

Tar, как отмечалось выше, создан только для упаковки и распаковки архивов, это его специализация, и делает он это самым наилучшим образом. Защита архива паролем - это специализированная задача из совершенно другой области, поэтому защитить архив Tar паролем возможно только с помощью внешних утилит и программного канала. В рамках этой демонстрации я покажу один пример из целого сонма возможных вариантов - шифрование с помощью утилиты openssl.

Естественно, для использования этого варианта пакет openssl должен быть установлен в системе.

v5Dj5Wlsqu.png

Давайте создадим сжатый архив Tar и защитим его паролем. Упаковывать в архив я буду те же самые файлы и каталоги, что и в предыдущих примерах этого обзора.

tar -c -z -f - db src | openssl enc -aria-256-cbc -pbkdf2 -e > ~/auriz.enc.tar.gz

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

KAf1BQgy6p.png

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

S9l8ZCjBQk.png

Ввожу этот же пароль и нажимаю enter. Упаковка и шифрование архива не сопровождается выхлопом, через некоторое время процесс завершится.

7OTYePMoRL.png

Как видно на снимке экрана выше, размер зашифрованного файла не отличается от размера аналогичного архива. Но распаковать такой архив можно только зная способ шифрования, алгоритм шифрования и, естественно, пароль с которым файл зашифрован. Давайте распакуем наш зашифрованный архив.

openssl enc -in ~/auriz.enc.tar.gz -aria-256-cbc -pbkdf2 -d | tar -x -z -f -

Последует запрос на ввод пароля.

3hAuB6XzFl.png

При вводе пароль опять не будет отображаться. Ввожу пароль и жму enter. Через некоторое время получаю извлечённые из зашифрованного архива каталоги и файлы.

xw1BnLrssg.png

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

Комментарии: