🖥️ 第05章 · 压缩与归档

tar gzip zip unzip

压缩与归档

这一章讲打包与压缩:把一堆文件装成一个包、把包再压小、反过来解压出来。备份、迁移、分发离线包、上传日志,全是这一套动作。

先分清"归档"与"压缩"

概念 什么 代表工具
归档 (archive) 把多个文件合并在一个文件里,但不减小体积 tar
压缩 (compress) 对内容做算法压缩,显著减小体积 gzip、zip、bzip2、xz

通常两者配合:先 tar 打包,再用 gzip 压缩,得到常见后缀 .tar.gz 或 .tgz。也有 zip——它一步就同时做了打包+压缩。

tar:打包与解包

tar 是 archive 的主角。关键选项:

选项 作用
-c 创建 (create) 归档
-x 解包 (extract)
-v 显示过程
-f 指定归档文件名(几乎必用)
-z 用 gzip 压缩/解压
-j 用 bzip2
-J 用 xz
-C 指定解压目标目录

一套完整的"打包+压缩"命令:

tar -czvf www-backup.tar.gz -C /var/www /var/www/bangdream
# -c 创建  -z gzip 压缩  -v 显示  -f 指定文件名
# -C /var/www 先切到 /var/www,再打包 bangdream,
#   这样包内路径是 bangdream/... 而不是 /var/www/bangdream/...

提示 -C 很重要。不指定 -C 的话,打包的会是 var/www/... 这种含完整路径的层级,解压出来容易覆盖到家目录之外。用 -C 把基准目录"锁死",包内路径干净可控。

解压到指定目录:

tar -xzvf www-backup.tar.gz -C /tmp/restore
# -x 解包 -z gzip 解压 -v 显示 -f 指定归档 -C 解压到 /tmp/restore

注意 解压时若包内文件已存在于目标目录,tar 会直接覆盖。先 tar -tzvf 包 查看列表,确认内容再解压,避免把现有目录覆盖错。

查看包内文件列表(不解压):

tar -tzvf www-backup.tar.gz
# -t 列出内容 -z 按 gzip 格式解析 -v 带详细信息
# -t 不会解包,只列清单,非常安全

最常用的三种后缀对应关系:

后缀 创建/解压命令
.tar tar -cf 包.tar 目录 / tar -xf 包.tar
.tar.gz tar -czf 包.tar.gz 目录 / tar -xzf 包.tar.gz
.tar.xz tar -cJf 包.tar.xz 目录 / tar -xJf 包.tar.xz

gzip 与 gunzip

gzip 只能压缩单个文件,所以它常和 tar 配合。

gzip access.log            # 原地压缩成 access.log.gz,原文件被替换
gunzip access.log.gz       # 解压回 access.log
gzip -k access.log         # 保留原文件 (-k 保留原文件)
gzip -9 access.log         # -9 最高压缩率(更慢)

注意 gzip 压缩后原文件会被删除,除非加 -k 或 -c 输出到别处。它不做打包——多个文件要用 tar 先合体。

zip 与 unzip

zip 一步完成"打包+压缩",生成 .zip,在 Windows 上也通用。

zip -r backup.zip /var/www/bangdream      # -r 递归打包目录
unzip backup.zip                          # 解压到当前目录
unzip backup.zip -d /tmp/restore          # 解压到指定目录
unzip -l backup.zip                       # 只列出内容
unzip -o backup.zip                       # -o 覆盖已存在文件

在这台服务器上打包一个应用目录并上传:

zip -r bangdream-$(date +%F).zip /var/www/bangdream
ls -lh bangdream-*.zip   # 看打好包的体积

提示 给备份文件加日期后缀($(date +%F)),不会覆盖上次的备份。这是服务器的通用做法——本机 /root/scripts/tieba_sign.py、monitor_report.py 这类定时脚本,输出带日期的备份/日志是基本操作。

三个压缩工具怎么选

工具 后缀 压缩率 速度 单文件/多文件
gzip .gz 中 快 单文件
bzip2 .bz2 较高 慢 单文件
xz .xz 最高 更慢 单文件
zip .zip 中 快 多文件
tar+... .tar.gz等 视配套 中 多文件

提示 日常备份优选 tar -cz(可靠、兼容广)。要跨平台给 Windows 用户,用 zip。对超大日志、追求极限压缩再考虑 xz。

实战:日志归档

以 nginx 日志的"按天切割归档"为例:

# 把昨天的访问日志压缩归档
tar -czf /root/logs/access-$(date -d yesterday +%F).tar.gz -C /var/log/nginx access.log
# 压缩后清空当前日志,让 nginx 重新写入
nginx -s reopen    # 常见做法,避免日志越滚越大

易错点

  • gzip 会删原文件,要保留就加 -k 或 -c。
  • tar 解压会覆盖同名文件,先 tar -t 看列表。
  • 不加 -C 会导致包内是冗长完整路径,解压时易跑出目标目录。
  • 别在 / 下打包整个系统,tar -czvf /root/all.tar.gz / 会把大量无关文件卷进来,还可能要 root 权限。

相关命令

tar、gzip、gunzip、bzip2、xz、zip、unzip、zcat(直接查看 .gz 内容)、cpio(另一种归档工具)。