第 4 章 · 05 压缩工具对比:`gzip`/`bzip2`/`xz`/`zstd`


第 4 章 · 05 压缩工具对比:gzip/bzip2/xz/zstd

本节摘要:上一节讲了「打包与压缩是两件事」,这一节专门讲压缩器本身。Linux 生态有四种主流压缩工具,各有取舍:gzip(老牌、快、通用)、bzip2(压缩率更高、慢)、xz(压缩率最高、更慢)、zstd(新秀,速度与压缩率兼顾)。新手常纠结「到底用哪个」,本节要给一张清晰的选型表——根据「速度、压缩率、CPU 成本、兼容性」四个维度,告诉你什么场景该用什么。理解这张选型表,你就能在工作中快速做对决定,而不是无脑 gzip 到底。

内容来源:综合 gzip/bzip2/xz/zstd 相关知识整理,套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. 说清四种压缩器各自的特点:gzip(快/老/通用)、bzip2(中)、xz(高压缩率/慢)、zstd(新秀/平衡)。
  2. 用四种工具各自压缩与解压单个文件。
  3. 根据「速度 vs 压缩率 vs CPU vs 兼容性」四维表,为不同场景选对压缩器。
  4. 理解为什么 .tar.gz 是最通用、.tar.xz 压缩率最高、.tar.zst 是未来趋势。
  5. 解释压缩器的「级别」(1-9)对速度与压缩率的影响。

一、设计动机:为什么会有这么多压缩器

不同的压缩算法有不同的取舍,核心矛盾是:压缩率越高,通常计算成本(CPU 时间)越大。没有「绝对最好」的算法,只有「特定场景下最合适」的。这催生了几代压缩器:

  • gzip(1992):基于 DEFLATE 算法。最老牌、最快、几乎所有系统都装了。压缩率一般。默认选择。
  • bzip2(1996):基于 Burrows-Wheeler 变换。压缩率比 gzip 高约 10-20%,但速度慢 3-5 倍。过渡产物,现已被 xz 大量取代。
  • xz / LZMA2(2009):基于 LZMA 算法。压缩率最高(比 gzip 高约 30%),但速度最慢、内存占用大。分发大文件首选(软件包 .deb/.rpm 内部用它)。
  • zstd / Zstandard(2015,Facebook):新一代算法。速度比 gzip 快、压缩率接近 xz。未来趋势,Linux 内核、容器镜像越来越多用它。

这四个工具的接口高度一致(都接受单个文件),差异主要在算法特性上。

二、四维选型表

这是本节的核心。根据四个维度对比:

工具 后缀 压缩率 速度 CPU/内存 兼容性 典型场景
gzip .gz 一般 快 低 极广(所有系统) 日志归档、流式压缩、默认选择
bzip2 .bz2 较高 慢 中 广 已被 xz 取代,少用
xz .xz 最高 最慢 高 较广 大文件分发(软件包)
zstd .zst 高 最快 中低 新(快速普及中) 实时压缩、容器、未来默认

决策口诀

  • 求兼容、求稳:选 gzip(.tar.gz)。老系统、跨平台、日志归档。
  • 求极致压缩率、文件大:选 xz(.tar.xz)。分发大软件包、长期冷存储。
  • 求速度、现代环境:选 zstd(.tar.zst)。实时压缩、容器镜像、内核。
  • 基本用不到:bzip2,已被 xz 取代。

三、高频用法对比

四种工具的接口惊人地一致,记住一种就能类推其他:

单文件压缩与解压

# gzip gzip file.txt # 压缩, 得到 file.txt.gz, 原文件消失 gzip -k file.txt # 压缩并保留原文件(-k keep) gzip -d file.txt.gz # 解压(d = decompress) gunzip file.txt.gz # 解压(等价于 gzip -d) # bzip2(j 系) bzip2 file.txt # 得到 file.txt.bz2 bzip2 -d file.txt.bz2 # 解压 # xz(J 系) xz file.txt # 得到 file.txt.xz xz -d file.txt.xz # 解压 # zstd zstd file.txt # 得到 file.txt.zst zstd -d file.txt.zst # 解压 ​

压缩级别(1-9)

所有压缩器都支持 -1(最快/压缩率最低)到 -9(最慢/压缩率最高),默认通常是 -6:

gzip -1 big.log # 最快压缩(牺牲压缩率) gzip -9 big.log # 最高压缩率(牺牲速度) ​

💡 技巧:压缩日志这类场景,-1 往往是性价比最高的选择——压缩率比 -6 低不了多少,但速度快好几倍。CPU 紧张时优先考虑低级别。

配合 tar(呼应上一节)

tar -czf a.tar.gz dir/ # gzip tar -cJf a.tar.xz dir/ # xz tar --zstd -cf a.tar.zst dir/ # zstd(tar 需较新版本支持) ​

三、踩坑与排错

坑 1:压缩会删原文件

gzip file.txt # file.txt 消失, 只剩 file.txt.gz ​

gzip/bzip2/xz 默认「压缩后删除原文件」。要保留加 -k(keep)。zstd 默认保留原文件(行为不同,注意)。

坑 2:压缩已经压缩过的文件收益极小

gzip photo.jpg # 几乎不变小! ​

JPEG/PNG/MP4/ZIP 这类格式已经是压缩过的,再用 gzip 压几乎不缩小(因为冗余已被榨干)。压缩只对「文本、日志、未压缩数据」效果显著。别浪费时间压缩二进制媒体文件。

坑 3:旧系统不认 xz/zstd

xz 在 2009 年才流行,zstd 在 2015 年。老系统(老 CentOS、嵌入式设备)可能没装,你传过去打不开。跨系统传输,稳妥选 gzip。

坑 4:zstd 与其他三者默认行为不同

zstd file.txt # 默认保留原文件 gzip file.txt # 默认删除原文件 ​

切换工具时注意默认行为差异,zstd「保留」而其他三者「删除」。

本节要点回顾

  1. 四种压缩器:gzip(快/通用)、bzip2(已被 xz 取代)、xz(压缩率最高/最慢)、zstd(新秀/平衡/未来)。
  2. 四维选型:求兼容稳→gzip;求极致压缩率→xz;求速度现代→zstd;bzip2 少用。
  3. 接口高度一致:工具 文件 压缩、工具 -d 解压;压缩级别 1-9(默认 6)。
  4. gzip/bzip2/xz 默认删原文件(加 -k 保留),zstd 默认保留——切换工具注意差异。
  5. 别压已压缩的二进制(JPG/MP4/ZIP),收益极小;压缩只对文本/日志有效。
  6. 跨系统传输稳妥选 gzip,老系统可能没有 xz/zstd。

下一节讲跨平台归档的备选——zip/unzip,它自带压缩、Windows 原生支持,适合「传给 Windows 同事」的场景。


作者与出处
原作者: 灏天文库
来源:jaywcjlove
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: 灏天文库 转发
评论区 (0)
U