Архивы в Linux: tar, gzip, xz, zstd, zip и 7-Zip простыми словами
Почему в Linux встречаются файлы с расширениями .tar.gz, .tar.xz и .tar.zst? Зачем нужны сразу два расширения? Чем tar отличается от gzip, а xz — от zstd?
Если вы только начинаете работать с Linux, система архивирования сначала действительно может показаться запутанной.
На практике всё становится намного проще, если понять один принцип:
Архивирование и сжатие — это разные операции.
В этой статье разберём:
- что делает
tar; - зачем нужны
gzip,xz,bzip2иzstd; - как создать и распаковать архив;
- когда лучше использовать ZIP или 7-Zip;
- как посмотреть содержимое архива без распаковки;
- как разделить большой архив на несколько файлов;
- какой формат выбрать для конкретной задачи.
Tar и сжатие — не одно и то же
Начнём с главного.
tar в первую очередь объединяет несколько файлов и каталогов в один архив.
Представим директорию:
| |
Создадим из неё архив:
| |
Получим один файл:
| |
При этом размер данных может почти не уменьшиться.
Почему?
Потому что tar собрал множество файлов в один архив, но сам по себе в данном случае не выполнял сжатие.
За сжатие отвечают другие программы:
gzip;bzip2;xz;zstd.
Именно поэтому в Linux так часто встречаются двойные расширения.
Например:
| |
.tar.gz означает:
- файлы собрали в
tar; - полученный архив сжали с помощью
gzip.
То есть условно:
| |
Когда понимаешь эту схему, большинство странностей Linux-архивов исчезает.
Основные команды tar
Создадим архив:
| |
Здесь:
c— create, создать архив;f— file, указать имя файла архива.
Посмотреть содержимое архива без распаковки:
| |
Распаковать:
| |
Можно добавить параметр v:
| |
v означает verbose: tar будет выводить имена файлов, с которыми работает.
Для повседневной работы этот параметр необязателен.
Как создать tar.gz
Один из самых распространённых вариантов в Linux — .tar.gz.
Создадим его:
| |
Здесь дополнительно используется:
| |
Получаем:
| |
Распаковать такой архив можно командой:
| |
Можно встретить и классический вариант:
| |
Он тоже работает.
Однако при чтении архива современный GNU tar во многих случаях способен самостоятельно определить используемый формат сжатия, поэтому удобная команда:
| |
часто оказывается достаточной.
gzip, xz, bzip2 и zstd: что выбрать
Теперь самое интересное — каким алгоритмом сжимать архив.
gzip
Расширение:
| |
Создание:
| |
gzip — один из самых распространённых и совместимых вариантов.
Его имеет смысл использовать, если нужна:
- хорошая совместимость;
- предсказуемость;
- поддержка практически на любой Linux-системе;
- нормальный баланс размера и скорости.
Для обычного универсального архива .tar.gz остаётся хорошим выбором.
xz
Расширение:
| |
Создание:
| |
xz обычно ориентирован на более сильное сжатие.
Цена за это — время и вычислительные ресурсы.
Поэтому .tar.xz часто встречается там, где важно уменьшить итоговый размер файла, а скорость создания архива менее критична.
bzip2
Расширение:
| |
Создание:
| |
bzip2 всё ещё поддерживается, а архивов .tar.bz2 существует огромное количество.
Однако для новых задач сегодня обычно есть более интересные варианты.
Поэтому знать bzip2 полезно прежде всего потому, что вы обязательно встретите такие архивы в существующих проектах.
zstd
Расширение:
| |
Создание:
| |
zstd, или Zstandard, интересен хорошим балансом:
- высокая скорость сжатия;
- очень высокая скорость распаковки;
- хорошая степень сжатия;
- удобство при работе с большими объёмами данных.
Поэтому zstd особенно полезно знать современному Linux- и DevOps-инженеру.
Можно также использовать автоматический выбор компрессора по расширению:
| |
Ключ:
| |
tar смотрит на расширение файла и выбирает подходящий алгоритм.
Например:
| |
Краткое сравнение форматов
| Формат | Особенность | Когда использовать |
|---|---|---|
.tar | Без сжатия | Нужно просто объединить файлы |
.tar.gz | Хорошая совместимость | Универсальный вариант |
.tar.xz | Сильное сжатие | Размер важнее скорости |
.tar.bz2 | Старый распространённый формат | Работа с существующими архивами |
.tar.zst | Быстрое современное сжатие | Бэкапы, логи, большие объёмы данных |
.zip | Отличная кроссплатформенность | Обмен с Windows/macOS |
.7z | Высокое сжатие и дополнительные возможности | Когда нужен формат 7-Zip |
Можно ли использовать gzip и zstd без tar
Да.
gzip, xz и zstd — самостоятельные программы.
Например, есть файл:
| |
Сожмём его:
| |
Получим:
| |
Аналогично с zstd:
| |
Получим:
| |
Но если нужно обработать целую директорию с множеством файлов, удобнее использовать связку:
| |
Именно поэтому .tar.gz и .tar.zst настолько распространены в Linux.
ZIP в Linux
ZIP — далеко не только Windows-формат.
Создать ZIP-архив директории:
| |
Распаковать:
| |
Посмотреть содержимое:
| |
ZIP особенно удобен, когда архив будет открываться пользователями разных операционных систем.
Например, если вы отправляете файл пользователю Windows, ZIP часто будет понятнее, чем:
| |
Поэтому формат стоит выбирать не только по степени сжатия, но и с учётом того, кто будет использовать полученный архив.
7-Zip в Linux
7-Zip также можно использовать в Linux.
В зависимости от установленной версии команда может выглядеть как:
| |
или:
| |
Создание архива:
| |
Распаковка:
| |
Посмотреть содержимое:
| |
Формат 7z интересен высокой степенью сжатия и дополнительными возможностями.
Например, он может использоваться для создания зашифрованных архивов.
При этом важно помнить:
сжатие и шифрование — тоже разные задачи.
Обычный .tar.gz не становится защищённым только потому, что данные находятся внутри архива.
Если речь идёт о действительно чувствительной информации, лучше отдельно рассматривать инструменты шифрования.
Как посмотреть архив перед распаковкой
Это полезная привычка, особенно если архив получен из неизвестного источника.
Для tar:
| |
Для ZIP:
| |
Для 7-Zip:
| |
Так можно сначала увидеть, какие файлы находятся внутри, и только потом выполнять распаковку.
Безопасная распаковка архивов
Неизвестный архив лучше не распаковывать сразу в:
| |
или:
| |
и даже рабочую директорию проекта.
Создайте отдельный каталог:
| |
Перейдите в него:
| |
И уже после этого распаковывайте архив.
Например:
| |
Так намного проще контролировать результат и не получить неожиданно сотни файлов в текущей директории.
Как разделить большой архив на части
Представим, что получился архив размером 20 ГБ:
| |
А передать его одним файлом неудобно.
Для этого в Linux есть универсальная команда split.
Например, разделим архив на части размером по 1 ГБ:
| |
Получим примерно такие файлы:
| |
Собрать их обратно можно командой:
| |
После этого:
| |
Этот пример хорошо показывает классический Unix-подход:
маленькие программы делают одну задачу, но их легко объединять друг с другом.
В нашем случае:
| |
Какие команды стоит запомнить
Если не хочется держать в голове десятки параметров, вот минимальный набор.
Создать tar
| |
Создать tar.gz
| |
Создать tar.xz
| |
Создать tar.zst
| |
Автоматически выбрать алгоритм по расширению
| |
Посмотреть содержимое
| |
Распаковать
| |
Создать ZIP
| |
Распаковать ZIP
| |
Создать 7z
| |
Распаковать 7z
| |
Что в итоге выбрать
Если нужен простой ориентир:
Нужна максимальная совместимость в Linux
| |
Важен небольшой размер
| |
Нужны высокая скорость и хороший уровень сжатия
| |
Архив нужно отправить обычному пользователю Windows или macOS
| |
Нужны возможности формата 7-Zip
| |
Главное, что стоит запомнить
Вся система архивов в Linux становится намного понятнее после одной идеи:
tar занимается архивированием, а gzip, xz, bzip2 и zstd — сжатием.
Поэтому:
| |
означает не какой-то странный особый формат.
Это просто:
| |
Для большинства современных задач достаточно понимать:
| |
А остальные форматы и десятки параметров всегда можно посмотреть в документации или man.
| |
Необязательно запоминать каждый ключ. Намного полезнее понимать, что именно делает каждый инструмент и зачем он нужен.
Полезные ссылки
GNU tar Manual — сжатие и поддерживаемые форматы
Работаtarсgzip,bzip2,xz,zstd, автоматический выбор компрессора и другие возможности.tar — Linux man-pages
Справка по командеtar, параметрам создания, просмотра и распаковки архивов.Zstandard (zstd) — официальный сайт
Документация по современному алгоритму сжатия Zstandard.7-Zip — официальный сайт
Архиватор 7-Zip, формат 7z и консольная версия для Linux.
Тест форматов
Можно просто скопировать:
| |
Получился очень наглядный тест. На файлеDevOps.mp4 zstd явно выигрывает по скорости, а xz/7z — по размеру.
| Формат | Сжатие | Распаковка | Размер | Скорость сжатия* |
|---|---|---|---|---|
| zstd | 0.25 c | 0.04 c | 18M | ~113 MB/s |
| gzip | 1.00 c | 0.17 c | 25M | ~28 MB/s |
| 7z | 3.29 c | 1.04 c | 17M | ~8.6 MB/s |
| xz | 10.12 c | 1.18 c | 17M | ~2.8 MB/s |
- Исходный файл:
28,228,463байт.
По скорости сжатия
zstd:
| |
оказался примерно:
- 4× быстрее gzip
- 13× быстрее 7z
- 40× быстрее xz
Причём размер получился всего около 1M больше, чем у xz/7z.
По скорости распаковки
Здесь разница ещё заметнее:
| |
То есть zstd распаковывается примерно:
- 4.3× быстрее gzip
- 26× быстрее 7z
- 30× быстрее xz
Эффективная скорость распаковки исходных 28.2 MB:
| |
По размеру
Получилось:
| |
Очень интересный результат именно для MP4: gzip почти ничего не дал, а xz, 7z и zstd нашли довольно много дополнительно сжимаемых данных.
Для 7z есть точное значение из вывода:
| |
Экономия:
| |
то есть примерно 39% уменьшения размера.
Итог
Лучший баланс — zstd
| |
Он отдаёт примерно 1 MB по сравнению с xz/7z, зато работает на порядок быстрее.
Минимальный размер — xz / 7z
| |
Но особенно xz платит за этот результат огромной потерей скорости:
| |
То есть 40× больше времени ради примерно 1 MB.
gzip здесь выглядит самым слабым:
| |
Он и медленнее zstd в 4 раза, и архив значительно больше.
Для бэкапов, передачи файлов, Docker/DevOps-задач я бы в этом тесте однозначно выбрал zstd. Для долговременного хранения, где важен каждый мегабайт и скорость неважна — xz или 7z.