Архивы в Linux: tar, gzip, xz, zstd, zip и 7-Zip простыми словами

Архивы в Linux: tar, gzip, xz, zstd, zip и 7-Zip простыми словами

Архивы в 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 в первую очередь объединяет несколько файлов и каталогов в один архив.

Представим директорию:

1
2
3
4
5
project/
├── config/
├── scripts/
├── logs/
└── README.md

Создадим из неё архив:

1
tar -cf project.tar project/

Получим один файл:

1
project.tar

При этом размер данных может почти не уменьшиться.

Почему?

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

За сжатие отвечают другие программы:

  • gzip;
  • bzip2;
  • xz;
  • zstd.

Именно поэтому в Linux так часто встречаются двойные расширения.

Например:

1
2
3
4
project.tar.gz
project.tar.xz
project.tar.bz2
project.tar.zst

.tar.gz означает:

  1. файлы собрали в tar;
  2. полученный архив сжали с помощью gzip.

То есть условно:

1
файлы → tar → gzip → archive.tar.gz

Когда понимаешь эту схему, большинство странностей Linux-архивов исчезает.


Основные команды tar

Создадим архив:

1
tar -cf backup.tar project/

Здесь:

  • c — create, создать архив;
  • f — file, указать имя файла архива.

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

1
tar -tf backup.tar

Распаковать:

1
tar -xf backup.tar

Можно добавить параметр v:

1
tar -xvf backup.tar

v означает verbose: tar будет выводить имена файлов, с которыми работает.

Для повседневной работы этот параметр необязателен.


Как создать tar.gz

Один из самых распространённых вариантов в Linux — .tar.gz.

Создадим его:

1
tar -czf backup.tar.gz project/

Здесь дополнительно используется:

1
z → gzip

Получаем:

1
backup.tar.gz

Распаковать такой архив можно командой:

1
tar -xf backup.tar.gz

Можно встретить и классический вариант:

1
tar -xzf backup.tar.gz

Он тоже работает.

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

1
tar -xf archive.tar.gz

часто оказывается достаточной.


gzip, xz, bzip2 и zstd: что выбрать

Теперь самое интересное — каким алгоритмом сжимать архив.

gzip

Расширение:

1
.tar.gz

Создание:

1
tar -czf backup.tar.gz project/

gzip — один из самых распространённых и совместимых вариантов.

Его имеет смысл использовать, если нужна:

  • хорошая совместимость;
  • предсказуемость;
  • поддержка практически на любой Linux-системе;
  • нормальный баланс размера и скорости.

Для обычного универсального архива .tar.gz остаётся хорошим выбором.


xz

Расширение:

1
.tar.xz

Создание:

1
tar -cJf backup.tar.xz project/

xz обычно ориентирован на более сильное сжатие.

Цена за это — время и вычислительные ресурсы.

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


bzip2

Расширение:

1
.tar.bz2

Создание:

1
tar -cjf backup.tar.bz2 project/

bzip2 всё ещё поддерживается, а архивов .tar.bz2 существует огромное количество.

Однако для новых задач сегодня обычно есть более интересные варианты.

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


zstd

Расширение:

1
.tar.zst

Создание:

1
tar --zstd -cf backup.tar.zst project/

zstd, или Zstandard, интересен хорошим балансом:

  • высокая скорость сжатия;
  • очень высокая скорость распаковки;
  • хорошая степень сжатия;
  • удобство при работе с большими объёмами данных.

Поэтому zstd особенно полезно знать современному Linux- и DevOps-инженеру.

Можно также использовать автоматический выбор компрессора по расширению:

1
tar -caf backup.tar.zst project/

Ключ:

1
a → auto-compress

tar смотрит на расширение файла и выбирает подходящий алгоритм.

Например:

1
2
3
tar -caf backup.tar.gz project/
tar -caf backup.tar.xz project/
tar -caf backup.tar.zst project/

Краткое сравнение форматов

ФорматОсобенностьКогда использовать
.tarБез сжатияНужно просто объединить файлы
.tar.gzХорошая совместимостьУниверсальный вариант
.tar.xzСильное сжатиеРазмер важнее скорости
.tar.bz2Старый распространённый форматРабота с существующими архивами
.tar.zstБыстрое современное сжатиеБэкапы, логи, большие объёмы данных
.zipОтличная кроссплатформенностьОбмен с Windows/macOS
.7zВысокое сжатие и дополнительные возможностиКогда нужен формат 7-Zip

Можно ли использовать gzip и zstd без tar

Да.

gzip, xz и zstd — самостоятельные программы.

Например, есть файл:

1
server.log

Сожмём его:

1
gzip server.log

Получим:

1
server.log.gz

Аналогично с zstd:

1
zstd server.log

Получим:

1
server.log.zst

Но если нужно обработать целую директорию с множеством файлов, удобнее использовать связку:

1
tar + компрессор

Именно поэтому .tar.gz и .tar.zst настолько распространены в Linux.


ZIP в Linux

ZIP — далеко не только Windows-формат.

Создать ZIP-архив директории:

1
zip -r backup.zip project/

Распаковать:

1
unzip backup.zip

Посмотреть содержимое:

1
unzip -l backup.zip

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

Например, если вы отправляете файл пользователю Windows, ZIP часто будет понятнее, чем:

1
backup.tar.zst

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


7-Zip в Linux

7-Zip также можно использовать в Linux.

В зависимости от установленной версии команда может выглядеть как:

1
7z

или:

1
7zz

Создание архива:

1
7z a backup.7z project/

Распаковка:

1
7z x backup.7z

Посмотреть содержимое:

1
7z l backup.7z

Формат 7z интересен высокой степенью сжатия и дополнительными возможностями.

Например, он может использоваться для создания зашифрованных архивов.

При этом важно помнить:

сжатие и шифрование — тоже разные задачи.

Обычный .tar.gz не становится защищённым только потому, что данные находятся внутри архива.

Если речь идёт о действительно чувствительной информации, лучше отдельно рассматривать инструменты шифрования.


Как посмотреть архив перед распаковкой

Это полезная привычка, особенно если архив получен из неизвестного источника.

Для tar:

1
tar -tf archive.tar.gz

Для ZIP:

1
unzip -l archive.zip

Для 7-Zip:

1
7z l archive.7z

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


Безопасная распаковка архивов

Неизвестный архив лучше не распаковывать сразу в:

1
/

или:

1
/etc/

и даже рабочую директорию проекта.

Создайте отдельный каталог:

1
mkdir unpack

Перейдите в него:

1
cd unpack

И уже после этого распаковывайте архив.

Например:

1
tar -xf ../archive.tar.gz

Так намного проще контролировать результат и не получить неожиданно сотни файлов в текущей директории.


Как разделить большой архив на части

Представим, что получился архив размером 20 ГБ:

1
backup.tar.zst

А передать его одним файлом неудобно.

Для этого в Linux есть универсальная команда split.

Например, разделим архив на части размером по 1 ГБ:

1
split -b 1G backup.tar.zst backup.part-

Получим примерно такие файлы:

1
2
3
4
backup.part-aa
backup.part-ab
backup.part-ac
backup.part-ad

Собрать их обратно можно командой:

1
cat backup.part-* > backup.tar.zst

После этого:

1
tar -xf backup.tar.zst

Этот пример хорошо показывает классический Unix-подход:

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

В нашем случае:

1
2
3
4
tar    → собирает файлы
zstd   → сжимает
split  → разделяет
cat    → соединяет

Какие команды стоит запомнить

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

Создать tar

1
tar -cf archive.tar directory/

Создать tar.gz

1
tar -czf archive.tar.gz directory/

Создать tar.xz

1
tar -cJf archive.tar.xz directory/

Создать tar.zst

1
tar --zstd -cf archive.tar.zst directory/

Автоматически выбрать алгоритм по расширению

1
tar -caf archive.tar.zst directory/

Посмотреть содержимое

1
tar -tf archive.tar.gz

Распаковать

1
tar -xf archive.tar.gz

Создать ZIP

1
zip -r archive.zip directory/

Распаковать ZIP

1
unzip archive.zip

Создать 7z

1
7z a archive.7z directory/

Распаковать 7z

1
7z x archive.7z

Что в итоге выбрать

Если нужен простой ориентир:

Нужна максимальная совместимость в Linux

1
.tar.gz

Важен небольшой размер

1
.tar.xz

Нужны высокая скорость и хороший уровень сжатия

1
.tar.zst

Архив нужно отправить обычному пользователю Windows или macOS

1
.zip

Нужны возможности формата 7-Zip

1
.7z

Главное, что стоит запомнить

Вся система архивов в Linux становится намного понятнее после одной идеи:

tar занимается архивированием, а gzip, xz, bzip2 и zstd — сжатием.

Поэтому:

1
.tar.gz

означает не какой-то странный особый формат.

Это просто:

1
2
3
4
5
6
7
файлы
tar
gzip
archive.tar.gz

Для большинства современных задач достаточно понимать:

1
2
3
4
5
6
tar
gzip
xz
zstd
zip
7-Zip

А остальные форматы и десятки параметров всегда можно посмотреть в документации или man.

1
man tar

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


Полезные ссылки


Тест форматов

Можно просто скопировать:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
echo "=== COMPRESSION ==="

/usr/bin/time -f 'gzip: %e sec' \
  sh -c 'gzip -c DevOps.mp4 > DevOps.mp4.gz'

/usr/bin/time -f 'xz: %e sec' \
  sh -c 'xz -c DevOps.mp4 > DevOps.mp4.xz'

/usr/bin/time -f 'zstd: %e sec' \
  sh -c 'zstd -c DevOps.mp4 > DevOps.mp4.zst'

/usr/bin/time -f '7z: %e sec' \
  7z a -t7z DevOps.mp4.7z DevOps.mp4


echo
echo "=== SIZE ==="

ls -lh \
  DevOps.mp4 \
  DevOps.mp4.gz \
  DevOps.mp4.xz \
  DevOps.mp4.zst \
  DevOps.mp4.7z


echo
echo "=== DECOMPRESSION ==="

/usr/bin/time -f 'gzip: %e sec' \
  sh -c 'gzip -dc DevOps.mp4.gz > /dev/null'

/usr/bin/time -f 'xz: %e sec' \
  sh -c 'xz -dc DevOps.mp4.xz > /dev/null'

/usr/bin/time -f 'zstd: %e sec' \
  sh -c 'zstd -dc DevOps.mp4.zst > /dev/null'

/usr/bin/time -f '7z: %e sec' \
  sh -c '7z x -so DevOps.mp4.7z > /dev/null'

Получился очень наглядный тест. На файлеDevOps.mp4 zstd явно выигрывает по скорости, а xz/7z — по размеру.

ФорматСжатиеРаспаковкаРазмерСкорость сжатия*
zstd0.25 c0.04 c18M~113 MB/s
gzip1.00 c0.17 c25M~28 MB/s
7z3.29 c1.04 c17M~8.6 MB/s
xz10.12 c1.18 c17M~2.8 MB/s
  • Исходный файл: 28,228,463 байт.

По скорости сжатия

zstd:

1
0.25 sec

оказался примерно:

  • 4× быстрее gzip
  • 13× быстрее 7z
  • 40× быстрее xz

Причём размер получился всего около 1M больше, чем у xz/7z.

По скорости распаковки

Здесь разница ещё заметнее:

1
2
3
4
zstd   0.04 sec
gzip   0.17 sec
7z     1.04 sec
xz     1.18 sec

То есть zstd распаковывается примерно:

  • 4.3× быстрее gzip
  • 26× быстрее 7z
  • 30× быстрее xz

Эффективная скорость распаковки исходных 28.2 MB:

1
2
3
4
zstd  ≈ 706 MB/s
gzip  ≈ 166 MB/s
7z    ≈ 27 MB/s
xz    ≈ 24 MB/s

По размеру

Получилось:

1
2
3
4
5
Original    27M
gzip        25M
zstd        18M
xz          17M
7z          17M

Очень интересный результат именно для MP4: gzip почти ничего не дал, а xz, 7z и zstd нашли довольно много дополнительно сжимаемых данных.

Для 7z есть точное значение из вывода:

1
2
Исходный: 28,228,463 bytes
7z:       17,228,929 bytes

Экономия:

1
28,228,463 - 17,228,929 = 10,999,534 bytes

то есть примерно 39% уменьшения размера.

Итог

Лучший баланс — zstd

1
2
3
18M
compression   0.25 sec
decompression 0.04 sec

Он отдаёт примерно 1 MB по сравнению с xz/7z, зато работает на порядок быстрее.

Минимальный размер — xz / 7z

1
~17M

Но особенно xz платит за этот результат огромной потерей скорости:

1
2
zstd:  0.25 sec → 18M
xz:   10.12 sec → 17M

То есть 40× больше времени ради примерно 1 MB.

gzip здесь выглядит самым слабым:

1
1.00 sec → 25M

Он и медленнее zstd в 4 раза, и архив значительно больше.

Для бэкапов, передачи файлов, Docker/DevOps-задач я бы в этом тесте однозначно выбрал zstd. Для долговременного хранения, где важен каждый мегабайт и скорость неважна — xz или 7z.


Видео по теме

Авторский пост защищен лицензией CC BY 4.0.

© solizarevich. Некоторые права защищены.

Использует тему Chirpy для Hugo

Популярные теги