Архивирование и сжатие файлов #
Обычные файлы на файловой системе в целом оптимизированы под задачи чтения и изменения их содержимого. Однако при их переносе их между системами возникают значительные трудности:
- На каждый файл может потребоваться выполнить отдельные действия.
- Для создания каталогов необходимо выполнить отдельные действия.
- При прямом копировании файлов теряется мета-информация, в частности время создания файла. В новый файл записывается новое время.
Копирование файлов между системами очень часто применяется:
- Для распространения приложений.
- Для создания резервных копий.
- Для переноса данных из активной зоны системы в зону хранения.
Архивирование файлов #
Под архивацией подразумевается упаковка содержимого и мета-информации о файлах в один файл, архив.
Созданный архив можно переносить между вычислительными системами, на целевой системе архив подвергается процедуре распаковке, чтобы получить доступ к оригинальным файлам.
Для распаковки данных может быть использован отдельный инструмент, но зачастую архиватор может как упаковывать, так и распаковывать архивы.
Архиваторы файлов 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.
Сжатие файлов #
При создании архива ключевой задачей является сохранение всех данных в едином потоке. Сжатие данных при создании архива не обязательно происходит.
Сжатие — это алгоритмическое преобразование данных, производимое с целью уменьшения занимаемого ими объёма. Альтернативные названия — упаковка данных, компрессия, сжимающее кодирование. Применяется для более рационального использования устройств хранения и передачи данных. Обратная процедура называется восстановлением данных, или распаковкой, или декомпрессией.
Сжатие можно применять не только к архивам, но и к любым файлам.
Приложения-компрессоры могут реализовать внутри себя один или несколько алгоритмов сжатия данных. Алгоритмы отличаются друг от друга:
- По степени сжатия.
- По производительности сжатия.
- По производительности распаковки.
- По возможности распараллеливания работы.
- По возможности обработки потоковых данных.
При создании публично доступных сжатых файлов следует учитывать возможность их декомпрессии на принимающей стороне. С учётом данного обстоятельства, коммерческие компрессоры зачастую предоставляют бесплатные приложения для выполнения декомпрессии.
Приложения-компрессоры 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 |
После заполнения таблицы ответьте на следующие вопросы:
- Какой компрессор показал наилучшую степень сжатия для файлов?
- Какой компрессор быстрее всего справился со сжатием файлов?
- Какой компрессор быстрее всего справился с декомпрессией файлов?
- Есть ли компрессор, который “победил” во всех категориях?
Архивация и сжатие #
С учётом того, что сжатые файлы эффективнее используют ресурсы, архивированные файлы зачастую подвергаются процедуре сжатия. Это логично, т.к. данные файлов в архиве не доступны на изменение.
Многие архиваторы с графическим пользовательским интерфейсом ориентированы в первую очередь на создание сжатых архивов. Их версии с командным интерфейсом также позволяют сразу создавать сжатый архив.
Классические инструменты 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 |