🖥️ 第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(另一种归档工具)。