Архивирование и сжатие файлов #
Обычные файлы на файловой системе в целом оптимизированы под задачи чтения и изменения их содержимого. Однако при их переносе их между системами возникают значительные трудности:
- На каждый файл может потребоваться выполнить отдельные действия.
- Для создания каталогов необходимо выполнить отдельные действия.
- При прямом копировании файлов теряется мета-информация, в частности время создания файла. В новый файл записывается новое время.
Копирование файлов между системами очень часто применяется:
- Для распространения приложений.
- Для создания резервных копий.
- Для переноса данных из активной зоны системы в зону хранения.
Архивирование файлов #
Под архивацией подразумевается упаковка содержимого и мета-информации о файлах в один файл, архив.
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
в домашнем каталоге пользователя:
- С использованием традиционной формы записи аргументов. Название файла
traditional-docs.tar
. - С использованием BSD-стиля аргументов. Название файла
bsd-docs.tar
. - С использованием GNU-стиля аргументов. Название файла
gnu-docs.tar
.
2. Сравнение размера #
Сравните размеры созданных архивов между собой. Для выяснения размера архивов
используйте приложение du
или ls
.
Сравните размер созданных архивов и каталога /usr/share/docs
. Размер
последнего можно узнать с помощью приложения du
.
3. Выяснение списка файлов #
Отобразите список файлов, находящийся внутри одного из созданных архивов.
4. Распаковка содержимого архива #
Распакуйте один из созданных архивов в каталог docs
, находящийся в домашнем
каталоге пользователя.
5. Использование потоков ввода-вывода #
Приложение tar
может сохранять данные в стандартный поток вывода при создании
архива, если аргумент f
не был передан приложению. Приложение tar
может
считывать данные из потока ввода при извлечении данных из архива, если аргумент
f
не был передан приложению. С использованием перенаправления потов
ввода-вывода:
- Создайте архив каталога
~/.cache
с использованием перенаправления в файлcache-archive.tar
в домашнем каталоге пользователя. - Распакуйте созданный архив в каталог
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. Сжатие разными компрессорами #
- Используйте компрессор
gzip
для создания сжатой версии файлаgnu-docs.tar
. - Сравните размер получившегося файла с другими вариантами архива каталога
/usr/share/docs
. - Выполните декомпрессию созданного файла
gnu-docs.tar.gz
. - Используйте компрессор
bz2
для создания сжатой версии файлаcache-archive.tar
. - Выполните декомпрессию созданного файла
cache-archive.tar.bz2
.
2. Дополнительные полезные опции #
Изучите страницы руководств для приложений-компрессоров.
- Каким образом сообщить приложению-компрессору, что нет необходимости удалять файл при выполнении операции? Проверьте своё предположение на одном из файлов-архивов.
- Каким образом можно выполнить операцию сжатия для данных, полученных из стандартного потока ввода данных? Выполните данную операцию для одного из файлов-архивов, передав данные через поток ввода.
- Какие существуют настройки для управления степенью сжатия? Сравните самый
быстрый вариант работы
bzip2
с самым медленным. Оцените размер получившихся файлов.
3. Сравнение разных компрессоров #
На основании файлов gnu-docs.tar
и cache-archive.tar
проведите сравнительный
анализ приложений-компрессоров по следующим характеристикам:
- Время выполнения сжатия.
- Время выполнения декомпрессии.
- Соотношение размера сжатого файла к размеру оригинального файла.
Для измерения времени выполнения операции можно использовать приложение time
.
Для выяснения более точного значения времени желательно провести операции сжатия
и декомпрессии несколько раз.
Предлагается заполнить следующую таблицу по результатам экспериментов.
Приложение-компрессор | Сжатие файла gnu-docs.tar |
Декомпрессия файла | Соотношение сжатый/оригинал | Сжатие файла cache-archive.tar |
Декомпрессия файла | Соотношение сжатый/оригинал |
---|---|---|---|---|---|---|
gzip |
||||||
bzip2 |
||||||
xz |
||||||
zstd |
После заполнения таблицы ответьте на следующие вопросы:
- Какой компрессор показал наилучшую степень сжатия для файлов?
- Какой компрессор быстрее всего справился со сжатием файлов?
- Какой компрессор быстрее всего справился с декомпрессией файлов?
- Есть ли компрессор, который “победил” во всех категориях?
Архивация и сжатие #
С учётом того, что сжатые файлы эффективнее используют ресурсы, архивированные файлы зачастую подвергаются процедуре сжатия. Это логично, т.к. данные файлов в архиве не доступны на изменение.
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. Сжатие и одновременная архивация #
- Создайте архив
traditional-docs.tar.xz
, сжатый с помощьюxz
, содержащий в себе каталог/usr/share/docs
. Используйте явное указание компрессора при выполнении этой задачи. - Создайте архив
cache-archive
, сжатый с помощьюzstd
. Используйте определение компрессора на основании расширения целевого файла.
2. Сравнение архиваторов #
Проведите сравнительный анализ использования архиваторов 7z
и tar
с
использованием приложений-компрессоров. Сравнение необходимо произвести по
следующим параметрам:
- Полное время архивирования и компрессии.
- Размер сжатого архива.
- Полное время распаковки архива.
Заполните следующую таблицу:
Архиватор | Время сжатия | Время распаковки | Размер архива |
---|---|---|---|
tar самый эффективный компрессор |
|||
tar самый быстрый компрессор |
|||
7z |