Архивирование и сжатие файлов

Архивирование и сжатие файлов #

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

  • На каждый файл может потребоваться выполнить отдельные действия.
  • Для создания каталогов необходимо выполнить отдельные действия.
  • При прямом копировании файлов теряется мета-информация, в частности время создания файла. В новый файл записывается новое время.

Копирование файлов между системами очень часто применяется:

  • Для распространения приложений.
  • Для создания резервных копий.
  • Для переноса данных из активной зоны системы в зону хранения.

Архивирование файлов #

Под архивацией подразумевается упаковка содержимого и мета-информации о файлах в один файл, архив.

flowchart LR

file1>Файл № 1]
file2>Файл № 2]
file3>Файл № 3]

archiver(Архиватор)

archive>Архив
Файл № 1
Файл № 2
Файл № 3] file1 --> archiver -- Архивирование --> archive file2 --> archiver file3 --> archiver

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

flowchart LR

file1>Файл № 1]
file2>Файл № 2]
file3>Файл № 3]

archiver(Архиватор)

archive>Архив
Файл № 1
Файл № 2
Файл № 3] archive --> archiver -- Распаковка --> file1 archiver -- Распаковка --> file2 archiver -- Распаковка --> file3

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

Архиваторы файлов cpio и tar #

Изначальным инструментом для создания архивных файлов в UNIX-среде было приложение cpio, которое создаёт архивный поток из данных, указанных в списке файлов. Альтернативой данному приложению стало приложение tar (tape archive), предназначенное для сохранения данных на ленточные носители.

На настоящий момент приложение tar является архиватором по умолчанию, которым пользуется большинство. Однако формат cpio тоже продолжает использоваться, например внутри RPM-архивов. Рассмотрим только приложение tar.

Рассмотрим краткий вариант использования tar для создания архивов:

tar cf archive.tar [file...]
tar -c -f archive.tar [file...]
tar --create --file archive.tar [file...]

Команда c, -c или --create создаёт новый архив на основании списка файлов и каталогов, которые будут указаны далее. Ключу f, -f или --file необходимо передать путь к архиву, в который будут помещены данные. В конце команды необходимо указать список файлов, которые должны быть помещены в архив.

Можно просмотреть содержимое архива без его распаковки:

tar tf archive.tar [member...]
tar -t -f archive.tar [member...]
tar --list --file archive.tar [member...]

Команда t, -t, --list выводит на стандартный поток список файлов, который находится в переданном архиве. Путь к архиву также указывается с помощью флага f. В конце команды можно указать список файлов, которые следует отобразить в выводе.

Для распаковки архива в каталог используется команда:

tar xf archive.tar -C directory [member...]
tar -x -f archive.tar -C directory [member...]
tar --extract --file archive.tar -C directory [member...]

Команда x, -x, --extract, --get позволяет распаковать всё содержимое архива или конкретный файл. Путь к архиву также указывается с помощью флага f.

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

Полезные опции.

  • -p, --preserve-permissions — сохранить атрибуты доступа файлов внутри архива. Автоматически устанавливается при работе от суперпользователя.
  • -v, --verbose — выводить на стандартный поток данных список обработанных файлов (упакованных или распакованных).

Задание № 1. Использование архиватора tar #

1. Упаковка каталогов #

Создайте tar-архив каталога /usr/share/docs в домашнем каталоге пользователя:

  1. С использованием традиционной формы записи аргументов. Название файла traditional-docs.tar.
  2. С использованием BSD-стиля аргументов. Название файла bsd-docs.tar.
  3. С использованием GNU-стиля аргументов. Название файла gnu-docs.tar.

2. Сравнение размера #

Сравните размеры созданных архивов между собой. Для выяснения размера архивов используйте приложение du или ls.

Сравните размер созданных архивов и каталога /usr/share/docs. Размер последнего можно узнать с помощью приложения du.

3. Выяснение списка файлов #

Отобразите список файлов, находящийся внутри одного из созданных архивов.

4. Распаковка содержимого архива #

Распакуйте один из созданных архивов в каталог docs, находящийся в домашнем каталоге пользователя.

5. Использование потоков ввода-вывода #

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

  1. Создайте архив каталога ~/.cache с использованием перенаправления в файл cache-archive.tar в домашнем каталоге пользователя.
  2. Распакуйте созданный архив в каталог cache-copy с использованием перенаправления данных из каталога cache-archive.tar.

Сжатие файлов #

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

Сжатие — это алгоритмическое преобразование данных, производимое с целью уменьшения занимаемого ими объёма. Альтернативные названия — упаковка данных, компрессия, сжимающее кодирование. Применяется для более рационального использования устройств хранения и передачи данных. Обратная процедура называется восстановлением данных, или распаковкой, или декомпрессией.

Сжатие можно применять не только к архивам, но и к любым файлам.

flowchart LR

file1>Файл]

compressor1(Компрессор № 1)
compressor2(Компрессор № 2)

compressed1>Сжатый файл № 1]
compressed2>Сжатый файл № 2]
compressed3>Сжатый файл № 3]

file1 --> compressor1
compressor1 --> compressed1

file1 --> compressor2
compressor2 -- Параметры
сжатия № 1 --> compressed2 compressor2 -- Параметры
сжатия № 2 --> compressed3

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

  • По степени сжатия.
  • По производительности сжатия.
  • По производительности распаковки.
  • По возможности распараллеливания работы.
  • По возможности обработки потоковых данных.

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

Приложения-компрессоры gzip, bzip2, xz, zstd #

В рамках экосистемы Linux пользователям доступны разные приложения-компрессоры. Они зачастую отличаются алгоритмом, который используется для выполнения операции.

  • gzip использует алгоритм Deflate.
  • bzip2 использует алгоритм Барроуза — Уилера.
  • xz использует алгоритм LZMA2. Ранее приложение могло называться lzma.
  • zstd использует алгоритм Zstandard.

Классическая схема использования UNIX-компрессоров следующая:

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

Для каждого приложения-компрессора существует своё собственное расширение и свой собственный mime-тип. Для указанных приложений они приведены ниже.

Компрессор Расширение mime-тип
gzip .gz application/gzip
bzip2 .bz2 application/x-bzip2
xz .xz application/x-xz
zstd .zst application/zstd

Приведённые компрессоры обладают схожим командным интерфейсом для выполнения операций сжатия и восстановления. Рассмотрим обобщённый вариант сжатия:

compressor file
compressor -z file
compressor --compress file

В результате выполнения операции большинство компрессоров создадут файл file.ext, где .ext будет соответствовать использованному архиватору.

Операция декомпрессии в обобщённом виде выглядит следующим образом:

compressor file.ext
compressor -d file.ext
compressor --decompress file.ext

Задание № 2. Использование компрессоров #

1. Сжатие разными компрессорами #

  1. Используйте компрессор gzip для создания сжатой версии файла gnu-docs.tar.
  2. Сравните размер получившегося файла с другими вариантами архива каталога /usr/share/docs.
  3. Выполните декомпрессию созданного файла gnu-docs.tar.gz.
  4. Используйте компрессор bz2 для создания сжатой версии файла cache-archive.tar.
  5. Выполните декомпрессию созданного файла cache-archive.tar.bz2.

2. Дополнительные полезные опции #

Изучите страницы руководств для приложений-компрессоров.

  1. Каким образом сообщить приложению-компрессору, что нет необходимости удалять файл при выполнении операции? Проверьте своё предположение на одном из файлов-архивов.
  2. Каким образом можно выполнить операцию сжатия для данных, полученных из стандартного потока ввода данных? Выполните данную операцию для одного из файлов-архивов, передав данные через поток ввода.
  3. Какие существуют настройки для управления степенью сжатия? Сравните самый быстрый вариант работы bzip2 с самым медленным. Оцените размер получившихся файлов.

3. Сравнение разных компрессоров #

На основании файлов gnu-docs.tar и cache-archive.tar проведите сравнительный анализ приложений-компрессоров по следующим характеристикам:

  • Время выполнения сжатия.
  • Время выполнения декомпрессии.
  • Соотношение размера сжатого файла к размеру оригинального файла.

Для измерения времени выполнения операции можно использовать приложение time. Для выяснения более точного значения времени желательно провести операции сжатия и декомпрессии несколько раз.

Предлагается заполнить следующую таблицу по результатам экспериментов.

Приложение-компрессор Сжатие файла gnu-docs.tar Декомпрессия файла Соотношение сжатый/оригинал Сжатие файла cache-archive.tar Декомпрессия файла Соотношение сжатый/оригинал
gzip
bzip2
xz
zstd

После заполнения таблицы ответьте на следующие вопросы:

  1. Какой компрессор показал наилучшую степень сжатия для файлов?
  2. Какой компрессор быстрее всего справился со сжатием файлов?
  3. Какой компрессор быстрее всего справился с декомпрессией файлов?
  4. Есть ли компрессор, который “победил” во всех категориях?

Архивация и сжатие #

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

flowchart LR

file1>Файл № 1]
file2>Файл № 2]

archiver1(Архиватор)
archiver2(Архиватор-компрессор)

archive1>Архив]

compressor1(Компрессор № 1)
compressed1>Сжатый архив № 1]

compressor2(Компрессор № 2)
compressed2>Сжатый архив № 2]
compressed3>Сжатый архив № 3]

file1 --> archiver1
file2 --> archiver1
archiver1 --> archive1

archive1 --> compressor1 --> compressed1
archive1 --> compressor2 
compressor2 -- Параметры
сжатия № 1 --> compressed2 compressor2 -- Параметры
сжатия № 2 --> compressed3 file1 --> archiver2 file2 --> archiver2 compressed4>Сжатый архив № 4] archiver2 --> compressed4

Многие архиваторы с графическим пользовательским интерфейсом ориентированы в первую очередь на создание сжатых архивов. Их версии с командным интерфейсом также позволяют сразу создавать сжатый архив.

Классические инструменты Linux можно использовать как отдельно, так и вместе. Для совмещения архиватора tar и приложения-компрессора можно воспользоваться конвейером, соединяющим стандартный выход архиватора и стандартный вход компрессора:

tar c files... | gzip -c > data.tar.gz

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

  • a, -a, --auto-compress использовать суффикс выходного файла для определения компрессора.
  • j, -j, --bzip2 использовать компрессор bzip2.
  • J, -J, --xz использовать компрессор xz.
  • --lz4 использовать компрессор lz4.
  • --lzma использовать компрессор lzma.
  • --lzop использовать компрессор lzop.
  • z, -z, --gzip использовать компрессор gzip.
  • --zstd использовать компрессор zstd.

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

Архиватор 7z #

Архиватор 7z позволяет работать со множеством сжатых архивов, созданных в других приложениях. В частности поддерживается распаковка следующих архивов: 7z, ZIP, CAB, ARJ, GZIP, BZIP2, TAR, RAR, CPIO, RPM и DEB.

Архиватор поддерживает создание архивов в форматах 7z, TAR, GZ, BZIP2 и XZ.

Рассмотрим общую структуру команды по созданию архива:

7z a archive file...
  • Ключ a указывает, что необходимо выполнить добавление файлов в архив.
  • Аргумент archive содержит путь к архиву. Расширение архива определяет алгоритм, который будет использован для сжатия. Тип можно также указать с помощью ключа -t.
  • В конце команды идёт список файлов и каталогов, которые необходимо добавить в архив.

Для распаковки архива используется следующая структура команды:

7z x -o{Directory} archive
  • Ключ x указывает, что необходимо выполнить распаковку файлов с сохранением полного пути к файлу.
  • Ключ -o{Directory} должен содержать путь к каталогу, в который необходимо распаковать содержимое архивов. Путь необходимо поместить вместо {Directory}, он должен быть частью аргумента.

Задание № 3. Архивация и сжатие #

1. Сжатие и одновременная архивация #

  1. Создайте архив traditional-docs.tar.xz, сжатый с помощью xz, содержащий в себе каталог /usr/share/docs. Используйте явное указание компрессора при выполнении этой задачи.
  2. Создайте архив cache-archive, сжатый с помощью zstd. Используйте определение компрессора на основании расширения целевого файла.

2. Сравнение архиваторов #

Проведите сравнительный анализ использования архиваторов 7z и tar с использованием приложений-компрессоров. Сравнение необходимо произвести по следующим параметрам:

  • Полное время архивирования и компрессии.
  • Размер сжатого архива.
  • Полное время распаковки архива.

Заполните следующую таблицу:

Архиватор Время сжатия Время распаковки Размер архива
tar самый эффективный компрессор
tar самый быстрый компрессор
7z

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su