Linux 压缩命令实战:tar、gzip、bzip2、xz、zstd 怎么选?一篇讲清楚

服务器磁盘告警,你的第一反应是什么?

大概率是:tar -czvf 老板别催了.tar.gz ./一堆日志

但是 -c -z -v -f 这几个参数到底是啥意思?为什么有人用 tar.gz,有人用 tar.bz2,还有人用 tar.xztar.zst?这些后缀背后藏着什么玄机?


一、为什么要搞清楚压缩命令?

不就是个压缩嘛,能有多复杂?

我之前也是这么想的------直到那次半夜,服务器磁盘 95%,我顺手敲了一个:

bash 复制代码
bzcat *.bz2 > all.log

想把一周的日志解压出来 grep 一把。结果......服务器假死了

事后排查:每个 .bz2 文件 60MB,解压后 ~1GB,一周 168 个文件解压后 168GB。磁盘瞬间被撑爆,OOM Killer 也开始干活,应用全挂。

那一刻我才意识到:压缩比这玩意儿不是数字游戏,它真的能压死你

所以这篇文章,我们把 Linux 主流压缩工具一次讲清楚------什么场景用什么、参数什么意思、怎么避免踩坑。


二、先把概念分清楚:打包 vs 压缩

很多人以为 tar -czvf 是一个命令,其实是两件事

工具 作用 比喻
tar 把多个文件打包成一个文件 把零散的衣服塞进一个行李箱
gzip / bzip2 / xz / zstd 把一个文件压缩变小 把行李箱抽真空

tar 本身不压缩 ,它只是把多个文件粘成一个 .tar。要压缩还得叫上 gzip 这帮兄弟。

bash 复制代码
# 两步走(教科书写法)
tar -cf logs.tar ./logs           # 打包
gzip logs.tar                     # 压缩 → logs.tar.gz

# 一步到位(实际工作中)
tar -czf logs.tar.gz ./logs       # 打包+压缩

Windows 用户的 .zip打包+压缩二合一,所以可能会有点不习惯。


三、tar 参数速查:让你不再死记硬背

tar 的参数堪称"屎山"------几十年累积下来的兼容性导致它非常诡异。但常用的就那几个

参数 全称 含义 记忆法
-c create 创建归档 Create
-x extract 解压归档 eXtract
-t list 查看归档内容(不解压) lisT
-f file 指定文件名(必加 File
-v verbose 显示过程 Verbose
-z gzip 用 gzip 压缩/解压 gZip
-j bzip2 用 bzip2 压缩/解压 bzJip2 (硬记)
-J xz 用 xz 压缩/解压 xJ (大写 J)
--zstd zstd 用 zstd 压缩/解压 直接写全名
-C change dir 解压到指定目录 Change

3.1 最常用的三个组合

bash 复制代码
# 1. 打包压缩(最常用)
tar -czvf backup.tar.gz ./data

# 2. 解压(自动识别格式,加不加 -z 都行,新版 tar 很智能)
tar -xzvf backup.tar.gz
tar -xvf backup.tar.gz            # 也行

# 3. 看看里面有什么(不解压)
tar -tzvf backup.tar.gz | head

小贴士-f 后面必须紧跟文件名 ,所以 -f 一般放最后。-czvf 而不是 -cfzv,养成习惯能少踩很多坑。

3.2 一些你可能不知道的骚操作

bash 复制代码
# 解压到指定目录(不是当前目录)
tar -xzvf backup.tar.gz -C /tmp/restore

# 只解压某个文件
tar -xzvf backup.tar.gz path/to/specific/file.log

# 排除某些文件再打包
tar -czvf backup.tar.gz ./data --exclude='*.log' --exclude='./data/cache'

# 边打包边通过 SSH 传到远程(无中间文件)
tar -czf - ./data | ssh user@remote "cat > /backup/data.tar.gz"

# 增量备份(基于上次的快照)
tar -czf backup-full.tar.gz -g snapshot.snar ./data    # 首次全量
tar -czf backup-incr.tar.gz -g snapshot.snar ./data    # 之后增量

四、四大压缩格式终极对比

这是本文的核心。先放结论表格:

格式 后缀 压缩比 压缩速度 解压速度 CPU 占用 推荐场景
gzip .gz ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 日常通用,兼容性最好
bzip2 .bz2 ⭐⭐⭐⭐ ⭐⭐ ⭐⭐ 压缩比要求高,速度其次
xz .xz ⭐⭐⭐⭐⭐ ⭐⭐⭐ 长期归档、发行版镜像
zstd .zst ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 低-中 现代场景首选

4.1 真实测试:1GB 日志文件

我用一个 1GB 的应用日志测了一下(仅供参考,结果会因数据特征而异):

工具 压缩耗时 压缩后大小 压缩比 解压耗时
gzip -6 18s 142 MB 14.2% 5s
bzip2 -6 95s 98 MB 9.8% 32s
xz -6 280s 76 MB 7.6% 12s
zstd -6 8s 135 MB 13.5% 3s
zstd -19 145s 82 MB 8.2% 3s

结论一目了然

  • 要快 :选 zstd
  • 要小 :选 xzzstd -19
  • 要兼容 :选 gzip
  • bzip2:在 zstd 出现后,地位有些尴尬

4.2 zstd:被低估的现代选手

zstd(Zstandard)是 Facebook 2016 年开源的压缩算法,速度接近 gzip,压缩比接近 xz------堪称六边形战士。

bash 复制代码
# 安装(CentOS / RHEL)
yum install zstd

# 安装(Ubuntu / Debian)
apt install zstd

# tar + zstd 打包压缩
tar --zstd -cvf logs.tar.zst ./logs

# 压缩级别 1-19,默认 3
zstd -19 huge.log              # 最高压缩
zstd -1 huge.log               # 最快速度

# 多线程压缩(充分利用 CPU)
zstd -T0 huge.log              # T0 = 用所有可用核心

趣闻:Linux 内核从 5.9 开始支持 zstd 压缩内核镜像,Arch Linux 的包管理器 pacman 也从 gzip 切到了 zstd。这都说明 zstd 在现代场景下确实更香。


五、那些年我们踩过的压缩坑

5.1 坑一:bzcat 解压全量文件撑爆磁盘 💥

回到开头那个案例。错误示范:

bash 复制代码
# 危险!解压后可能比原文件大 10-15 倍
bzcat *.bz2 > all.log

如果 100 个 .bz2 文件每个 60MB,解压后可能达到 60GB+

正确姿势:用管道流式处理,不落盘:

bash 复制代码
# 流式 grep,内存足够,磁盘无压力
bzcat *.bz2 | grep "ERROR"

# 或者按天分批处理
for day in 01 02 03; do
  bzcat app.log.2026-04-${day}-*.bz2 | grep "ERROR" >> errors.log
done

核心原则解压数据要么流式处理,要么估算好磁盘空间再落盘

5.2 坑二:tar 解压把当前目录搞乱

有些同学的 .tar.gz 不规范,里面的文件没有顶层目录,解压后把当前目录全炸了------满屏都是文件。

bash 复制代码
# 先看看再解压(养成好习惯)
tar -tzvf mystery.tar.gz | head -5

# 强制解压到独立目录
mkdir extracted && tar -xzvf mystery.tar.gz -C extracted

5.3 坑三:没用 -f 参数

bash 复制代码
# 错误(会卡住等输入)
tar -czv backup.tar.gz ./data

# 正确
tar -czvf backup.tar.gz ./data

-f 是必需的,否则 tar 默认从标准输入读、写到标准输出。

5.4 坑四:压缩级别用错

很多人不知道 gzip / xz / zstd 都有 -1-9(zstd 到 -19)的压缩级别:

bash 复制代码
gzip -1 file       # 最快,压缩比最低
gzip -9 file       # 最慢,压缩比最高
gzip file          # 默认 -6

重要提醒 :从 -6 加到 -9,压缩耗时可能翻 2-3 倍,但压缩比往往只多 1-2%。不是越高越好

5.5 坑五:tar.gz 损坏后只能从头开始恢复

gzip / bzip2 / xz流式压缩,文件中间损坏一个字节,后面的全废了。

如果数据非常重要,考虑用 zip(可以单独修复某个文件),或者把大归档拆成多个小归档:

bash 复制代码
# 把大归档拆成 100MB 一个
tar -czvf - ./data | split -b 100M - backup.tar.gz.

# 恢复
cat backup.tar.gz.* | tar -xzvf -

六、场景化推荐:到底用哪个?

场景 推荐 理由
日常打包传文件 tar.gz 兼容性最好,对方一定能解
发布软件包 tar.xz 压缩比高,下载快
数据库备份 tar.zst -T0 多线程快,CPU 不浪费
日志归档 tar.gztar.bz2 配合 logrotate 自动滚动
大量小文件 tar.zst zstd 对小文件场景效率高
跨平台分享 zip Windows 双击就能开
临时给同事看一眼 直接 catless 别压了,浪费时间

七、加分项:你可能不知道的小技巧

7.1 不解压直接看 .gz / .bz2 / .xz / .zst 文件

bash 复制代码
zcat file.gz                  # gzip
bzcat file.bz2                # bzip2
xzcat file.xz                 # xz
zstdcat file.zst              # zstd

# 配合 less 翻页查看
zless huge.log.gz
xzless huge.log.xz

# 配合 grep 搜索
zgrep "ERROR" file.gz
bzgrep "ERROR" file.bz2
xzgrep "ERROR" file.xz

这些 z* 命令是日常排查日志的神器,不需要先解压再 grep

7.2 验证压缩文件是否完整

bash 复制代码
gzip -t file.gz                # 测试 gzip 完整性
bzip2 -t file.bz2              # 测试 bzip2 完整性
xz -t file.xz                  # 测试 xz 完整性
zstd -t file.zst               # 测试 zstd 完整性

# tar 可以列出内容来验证
tar -tzf backup.tar.gz > /dev/null && echo "OK"

7.3 一行命令打包远程目录到本地

bash 复制代码
ssh user@remote "tar -czf - /var/log" > local-logs.tar.gz

中间不落盘,省时省心。


八、总结

记住几个核心要点,你就比 90% 的人更懂压缩:

  1. tar 只打包,gzip/bzip2/xz/zstd 才压缩------这是基础认知
  2. 现代场景优先用 zstd------速度和压缩比都很均衡
  3. 解压前先估算磁盘空间------别像我一样把服务器搞挂
  4. 流式处理优先 ------能管道就别落盘,zgrepzcat | grep 是好朋友
  5. 压缩级别不是越高越好------边际收益递减很明显
场景 一句话决策
日常通用 tar -czvf 安全牌
追求速度 tar --zstd -cvf
追求大小 tar -cJvf(xz)
追求老板满意 别加班压缩,用 logrotate 自动滚动

最后送大家一句箴言:"压缩是一门艺术,解压是一门玄学,而恢复 OOM 的服务器是一门体力活。"

如果这篇文章帮你避开了一个坑,记得点赞收藏。下次半夜被告警叫起来时,至少你不会再敲 bzcat *.bz2 > all.log 了。

相关推荐
IT WorryFree2 小时前
飞塔防火墙与第三方设备进行IPSEC故障诊断期间,用户可能会观察到以下错误:
linux·服务器·网络
12345,catch a tiger2 小时前
虚拟机ubuntu安装Vmware Tools
linux·运维·ubuntu
✎ ﹏梦醒͜ღ҉繁华落℘2 小时前
Makefile -GNU和MakeFile关系(二)
服务器·gnu
凉、介3 小时前
别再把 PCIe 的 inbound/outbound、iATU 和 eDMA 混为一谈
linux·笔记·学习·嵌入式·pcie
辰风沐阳3 小时前
OpenClaw 安装教程(Ubuntu 24.04 Desktop)
linux·ubuntu
嘿嘿嘿x33 小时前
Linux记录过程
linux·开发语言
程序猿编码4 小时前
一个授予普通进程ROOT权限的Linux内核级后门:原理与实现深度解析
linux·运维·服务器·内核·root权限
小夏子_riotous4 小时前
openstack的使用——9. 密钥管理服务Barbican
linux·运维·服务器·系统架构·centos·云计算·openstack
梦想的旅途25 小时前
自动化运营如何防封?解析 API 协议下的拟人化风控算法
运维·自动化