第10章:压缩与归档

第十章:压缩与归档

10.1 tar 打包命令

tar = Tape ARchive,磁带归档。这是 Linux 中最经典的归档工具,诞生于磁带机时代。虽然现在没人用磁带了,但 tar 依然是最常用的打包工具!

10.1.1 tar -cvf archive.tar 目录:打包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 语法:tar -cvf 归档文件名 要归档的目录
# -c = create,创建归档
# -v = verbose,显示过程
# -f = file,指定归档文件名

# 示例:把 documents 目录打包成 archive.tar
tar -cvf archive.tar documents/

# 输出:
# documents/
# documents/file1.txt
# documents/file2.txt
# documents/subdir/
# documents/subdir/file3.txt

小技巧:归档文件名的后缀建议用 .tar,这是一个约定俗成的命名习惯!

10.1.2 tar -tvf archive.tar:查看内容

1
2
3
4
5
6
7
# -t = list,列出归档内容(不解压)
tar -tvf archive.tar

# 输出:
# drwxr-xr-x  2 user user 4096 Jan 15 10:30 documents/
# -rw-r--r--  1 user user  123 Jan 15 10:30 documents/file1.txt
# -rw-r--r--  1 user user  456 Jan 15 10:30 documents/file2.txt

用 -tvf 可以预览归档包里有什么,还不用解压,非常方便!

10.1.3 tar -xvf archive.tar:解包

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# -x = extract,解包
tar -xvf archive.tar

# 解压到指定目录 -C
tar -xvf archive.tar -C /tmp/

# 输出:
# documents/
# documents/file1.txt
# documents/file2.txt
# ...
graph TD
    A["tar 打包"] --> B["tar -cvf archive.tar dir/"]
    A --> C["解包"]
    A --> D["查看内容 tar -tvf"]
    C --> E["tar -xvf archive.tar"]
    E --> F["tar -xvf archive.tar -C /path/"]

10.2 tar 解包

10.2.1 tar -xvf archive.tar -C 目录

1
2
3
4
# -C = change to directory,切换到指定目录再解压
tar -xvf archive.tar -C /tmp/

# 解压后的内容会在 /tmp/documents/ 下

10.2.2 解压时的一些选项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 解压单个文件(从归档中提取特定文件)
tar -xvf archive.tar documents/file1.txt

# 解压多个文件(通配符)
tar -xvf archive.tar --wildcards "*.txt"

# 解压时保留文件的权限信息
tar -xvpf archive.tar

# 注意:-p(小写)= preserve-permissions,按归档里记录的权限还原文件,
# 一般只对 root 有意义(普通用户无法把文件"还"成别人的所有者)。
# 而 -P(大写)= --absolute-names,表示不要剥掉路径开头的 "/"。

⚠️ 关于 -P 的警告:默认情况下 tar 会主动去掉归档里路径开头的 /,把 /etc/passwd 还原成 etc/passwd(相对当前目录),这是故意的安全设计——否则解压一个别人给的包就可能直接覆盖系统文件。请把 -P 当成危险选项,只在完全清楚包内容时使用。

💡 解压前先看一眼:拿到来源不明的 .tar.gz,先用 tar -tvf 列一遍内容,确认里面没有 ../ 这类向上跳的路径(这种叫 tar 路径穿越 / tar slip),再解压。更稳妥的写法是加上 --no-absolute-filenames 或先解到空目录里检查。


10.3 tar 打包同时压缩

tar 本身只是"打包",不压缩。但它可以调用压缩工具,实现一步到位打包+压缩!

10.3.1 tar -czvf archive.tar.gz 目录:gzip 压缩

gzip 是最常用的压缩格式,压缩比和速度都不错:

1
2
3
4
5
6
7
8
# -z = gzip,使用 gzip 压缩/解压
tar -czvf archive.tar.gz documents/

# 输出:
# documents/
# documents/file1.txt
# ...
# 文件名建议加 .gz 后缀

10.3.2 tar -cjvf archive.tar.bz2 目录:bzip2 压缩

bzip2 压缩比更高,但速度稍慢:

1
2
3
4
# -j = bzip2,使用 bzip2 压缩
tar -cjvf archive.tar.bz2 documents/

# 文件名建议加 .bz2 后缀

10.3.3 tar -cJvf archive.tar.xz 目录:xz 压缩

xz 压缩比最高,但速度最慢:

1
2
3
4
# -J = xz,使用 xz 压缩
tar -cJvf archive.tar.xz documents/

# 文件名建议加 .xz 后缀

10.3.4 tar -xzvf archive.tar.gz:解压 gz

1
2
3
4
5
6
7
8
# 解压 .tar.gz
tar -xzvf archive.tar.gz

# 解压 .tar.bz2
tar -xjvf archive.tar.bz2

# 解压 .tar.xz
tar -xJvf archive.tar.xz

10.3.5 压缩格式对比

格式选项后缀压缩速度压缩比
gzip-z.gz快适中
bzip2-j.bz2中等较高
xz-J.xz慢最高
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 实战建议:
# 日常使用:gzip(速度快,兼容性好)
tar -czvf backup.tar.gz /home/user

# 需要极致压缩:xz(文件很大,不急着完成)
tar -cJvf backup.tar.xz /home/user

# 时间紧迫:gzip -1(最快压缩)
# ⚠️ tar 没有"把压缩级别直接写在 -czvf 后面"的语法:
#    写成 tar -czvf -1 backup.tar.gz 会把 "-1" 当成归档文件名!
#    正确做法是把级别交给 gzip,用 GZIP 环境变量:
GZIP=-1 tar -czf backup.tar.gz /home/user

# 或者手动接一根管子,效果一样且更直观:
tar -cf - /home/user | gzip -1 > backup.tar.gz

记住这个坑:tar 只负责打包,压缩级别是 gzip/xz 的参数,tar 会把 -f 后面紧挨着的那个词当文件名,所以 -czvf 后面必须直接跟归档名。想调级别就用 GZIP=-9,或者 --use-compress-program='gzip -9'。


10.4 gzip 压缩

gzip 是 GNUzip 的缩写,是 Linux 最流行的压缩工具。

10.4.1 gzip 文件:压缩

1
2
3
4
5
6
7
8
# 压缩 file.txt,生成 file.txt.gz(原始文件被删除)
gzip file.txt

# 压缩多个文件
gzip file1.txt file2.txt file3.txt

# 压缩目录下所有 .txt 文件(递归)
gzip -r documents/

10.4.2 gunzip 文件.gz:解压

1
2
3
4
5
6
7
8
# 解压 file.txt.gz,生成 file.txt(压缩文件被删除)
gunzip file.txt.gz

# 解压所有 .gz 文件
gunzip *.gz

# 解压并保留压缩文件
gunzip -k file.txt.gz

10.4.3 gzip -k 保留原文件

1
2
3
4
5
6
7
# -k = keep,保留原始文件
gzip -k largefile.iso

# 查看结果
ls -lh largefile*
# largefile.iso   4.0G
# largefile.iso.gz  1.5G

10.4.4 gzip -9 最高压缩

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# -1 到 -9,压缩级别
# -1 = 最快(压缩比低)
# -9 = 最慢(压缩比最高)
# 默认是 -6

# 最高压缩比
gzip -9 bigfile.txt

# 最快压缩
gzip -1 bigfile.txt

10.4.5 查看压缩文件内容

1
2
3
4
5
6
7
8
# zcat = gzip + cat,不需要解压直接查看 .gz 文件内容
zcat file.txt.gz

# zless = gzip + less
zless file.txt.gz

# zgrep = gzip + grep
zgrep "keyword" file.txt.gz

10.5 bzip2 压缩

bzip2 是另一种压缩工具,压缩比通常比 gzip 高。

10.5.1 bzip2 文件

1
2
3
4
5
6
7
8
# 压缩 file.txt,生成 file.txt.bz2
bzip2 file.txt

# -k 保留原文件
bzip2 -k file.txt

# -d 解压
bzip2 -d file.txt.bz2

10.5.2 bunzip2 文件.bz2

1
2
3
4
5
# bunzip2 是 bzip2 -d 的别名
bunzip2 file.txt.bz2

# 解压并保留原文件
bunzip2 -k file.txt.bz2

10.6 xz 压缩

xz 基于 LZMA2 算法,压缩比在常见工具里数一数二,代价是压缩(尤其解压)都更吃 CPU 和时间。

10.6.1 xz 文件

1
2
3
4
5
6
7
8
# 压缩 file.txt,生成 file.txt.xz
xz file.txt

# -k 保留原文件
xz -k file.txt

# -d 解压
xz -d file.txt.xz

10.6.2 unxz 文件.xz

1
2
# unxz 是 xz -d 的别名
unxz file.txt.xz

10.6.3 xz 的特殊功能

1
2
3
4
5
6
7
8
9
# -l 列出压缩文件信息(不解压)
xz -l archive.tar.xz

# 输出:
# Strms  Blocks   Compressed  Uncompressed  Ratio  Check
#     1       1     1,234 KB     5,678 KB  21.7%  CRC64

# -T 线程数(多线程压缩,速度更快)
xz -T 4 bigfile.tar

10.6.4 补充:zstd——现在更常用的选择

如果只挑一个"现代"压缩工具,那应该是 zstd(Zstandard,Facebook 于 2016 年开源)。它的定位很务实:压缩比接近 xz,速度却和 gzip 一个量级,还支持多线程、字典和 1~19 的可调级别。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 安装
sudo apt install zstd          # Ubuntu/Debian
sudo dnf install zstd          # RHEL/Rocky

# 压缩 / 解压(zstd 默认会删除原文件,这点和 gzip 一致)
zstd bigfile.log
unzstd bigfile.log.zst

# 保留原文件
zstd -k bigfile.log

# 用 zstd 直接解压 gzip 文件(它能识别 .gz)
unzstd file.log.gz

# 和 tar 配合(GNU tar 1.31+ 支持 --zstd)
tar --zstd -cvf logs.tar.zst /var/log/
tar --zstd -xvf logs.tar.zst

# 对比一下压缩比与耗时
zstd -b bigfile.log

实用经验:给别人打包用 xz(体积最小、兼容性最好),自己机器上的日志和备份用 zstd(快)。如今 Arch 的软件包、systemd 的 coredump、ZFS 等都已经默认使用 zstd 了。


10.7 zip/unzip 压缩

zip 和 unzip 是 Windows 和 Linux 之间交换数据时的常用格式,因为 Windows 原生支持 .zip 文件。

10.7.1 zip -r archive.zip 目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 安装 zip/unzip(Ubuntu)
sudo apt install zip unzip

# 创建压缩包
zip -r backup.zip documents/

# 排除某些文件(zip 的排除选项是 -x,不是 --exclude!)
zip -r backup.zip documents/ -x "*.tmp"

# -x 的匹配范围是"归档内的路径",所以只排根一级的 .tmp 要写 "documents/*.tmp"
zip -r backup.zip documents/ -x "documents/*.tmp"

# 设置压缩级别(0-9)
zip -9 -r backup.zip documents/

--exclude 不是 zip 的选项:很多教程照抄 rsync/tar 的写法写成 zip ... --exclude "*.tmp",zip 会把它当成"要打包的文件名",然后报 zip warning: name not matched: --exclude。zip 用的是 -x。

10.7.2 unzip archive.zip

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 解压到当前目录
unzip backup.zip

# 解压到指定目录
unzip backup.zip -d /tmp/extract/

# 解压单个文件
unzip backup.zip documents/file.txt

# 查看压缩包内容(不解压)
unzip -l backup.zip

# 查看文件信息
unzip -v backup.zip

10.7.3 加密压缩

1
2
3
4
5
6
7
# -e = encrypt,加密压缩
zip -e secure.zip sensitive.txt
# 会提示输入密码

# 解密解压
unzip secure.zip
# 会提示输入密码

⚠️ zip 的密码保护很弱:zip -e 用的是老的 ZipCrypto 算法,早已被证明容易被破解(有成熟工具能在短时间内跑出弱密码)。涉及敏感数据时不要用它,改用:

1
2
7z a -p -mhe=on secure.7z sensitive.txt     # 7z 支持 AES-256,-mhe 还能加密文件名
gpg -c sensitive.txt                         # 直接用 GPG 加密(最稳妥)

另外,gzip 和 tar 完全没有加密功能,tar.gz 里的内容任何人拿到都能直接解开。别把 .tar.gz 当成"加密的压缩包"。


10.8 7z 格式

7z 是一种高压缩比的格式,但需要安装 p7zip 包。

10.8.1 7z a archive.7z 文件

1
2
3
# Ubuntu 安装
sudo apt install p7zip-full     # 老包名,Debian 12/Ubuntu 22.04 及以前
sudo apt install 7zip           # 新包名,Ubuntu 24.04+/Debian 13 起

包名换过一次:老的 p7zip-full 已经停止维护,新发行版改用 7zip(提供同一个 7z 命令)。如果 apt install p7zip-full 提示找不到包,就换成 7zip。两条命令装完都能直接用 7z。

1
2
3
4
5
6
7

# 创建 7z 压缩包
# a = add,添加文件到压缩包
7z a archive.7z documents/

# 压缩多个文件
7z a archive.7z file1.txt file2.txt file3.txt

10.8.2 7z x archive.7z

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 解压 7z 文件
# x = extract,解压到当前目录
7z x archive.7z

# 解压到指定目录
7z x archive.7z -o/tmp/extract/

# 查看压缩包内容
7z l archive.7z

# 测试压缩包完整性
7z t archive.7z

10.8.3 7z 其他选项

1
2
3
4
5
6
7
8
9
# 设置压缩级别(0-9)
7z a -mx=9 archive.7z bigfile/

# 分卷压缩(将大文件分割成多个小文件)
7z a -v100m backup.7z bigfile/
# 生成 backup.7z.001, backup.7z.002 ...

# 解压分卷
7z x backup.7z.001

注意:7z 没法把内容"追加"进一个 .tar.gz。-v100m 是 7z 自己的分卷参数,输出文件名必须是 7z 归档(.7z)。如果写成 7z a backup.tar.gz,你只会得到一个"名字叫 .tar.gz、内容却是 7z 格式"的四不像文件,以后用 tar 根本打不开。


10.9 压缩级别选择:-1 到 -9

大多数压缩工具都支持 1-9 的压缩级别:

1
2
3
4
5
6
7
8
9
# gzip 压缩级别示例
gzip -1 file.txt   # 最快,压缩比低
gzip -6 file.txt   # 默认,平衡
gzip -9 file.txt   # 最慢,压缩比高

# 时间 vs 空间 权衡
# 场景1:一次性备份,愿意等 → -9
# 场景2:实时压缩日志,讲究速度 → -1
# 场景3:日常使用 → 默认(-6)
级别速度压缩比适用场景
-1 / –fast最快最低实时压缩、大量文件
-6 / –default中等适中日常使用
-9 / –best最慢最高一次性备份、空间有限

10.10 实战:定期备份网站文件

让我们来一个综合实战,用脚本实现定期备份!

10.10.1 备份脚本

 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
41
#!/bin/bash
# backup.sh - 网站文件备份脚本

# 定义变量
DATE=$(date +%Y%m%d_%H%M%S)               # 当前日期时间
BACKUP_DIR="/tmp/backups"                  # 备份存储目录
WEB_ROOT="/var/www/html"                   # 网站根目录
DB_NAME="mywebsite"                        # 数据库名
DB_USER="dbuser"                           # 数据库用户
DB_PASS="yourpassword"                     # 数据库密码(实际使用时请用更安全的方式)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 备份网站文件(tar.gz 格式)
tar -czvf $BACKUP_DIR/www_backup_$DATE.tar.gz $WEB_ROOT

# 备份数据库(mysqldump)
# 方法1:交互式输入密码(更安全,密码不会出现在命令历史中)
mysqldump -u$DB_USER -p $DB_NAME | gzip > $BACKUP_DIR/db_backup_$DATE.sql.gz
# 执行后会提示输入密码

# 方法2:使用配置文件(~/.my.cnf)存储密码(适合自动化脚本)
# 在 ~/.my.cnf 中添加:
# [mysqldump]
# user=dbuser
# password=yourpassword
# 然后直接运行:
# mysqldump $DB_NAME | gzip > $BACKUP_DIR/db_backup_$DATE.sql.gz

# ⚠️ 方法3:命令行直接带密码(不推荐,密码会留在命令历史中!)
# mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_backup_$DATE.sql.gz

# 输出备份完成信息
echo "Backup completed at $DATE"
echo "Files:"
echo "  - $BACKUP_DIR/www_backup_$DATE.tar.gz"
echo "  - $BACKUP_DIR/db_backup_$DATE.sql.gz"

# 备份日志
echo "[$DATE] Backup completed successfully" >> /var/log/backup.log

说明:

  • $(date +%Y%m%d_%H%M%S) 生成带时间戳的文件名,避免覆盖
  • tar -czvf 一步完成打包+压缩
  • mysqldump 导出数据库,gzip 压缩 SQL 文件
  • 使用绝对路径确保脚本在任何目录执行都能正常工作

10.10.2 设置定时任务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 给脚本添加执行权限
chmod +x backup.sh

# 编辑 crontab(定时任务)
crontab -e

# 添加以下行(每天凌晨3点执行备份):
0 3 * * * /path/to/backup.sh

# crontab 格式说明:
# ┌───────────── 分钟 (0-59)
# │ ┌─────────── 小时 (0-23)
# │ │ ┌───────── 日 (1-31)
# │ │ │ ┌─────── 月 (1-12)
# │ │ │ │ ┌───── 星期 (0-7, 0和7都是周日)
# │ │ │ │ │
0 3 * * * /path/to/backup.sh

10.10.3 备份策略建议

graph TD
    A["备份策略"] --> B["每日增量备份"]
    A --> C["每周全量备份"]
    A --> D["异地存储"]
    A --> E["定期测试恢复"]
    
    B --> F["只备份新增/修改的文件"]
    C --> G["备份所有文件"]
    D --> H["云存储/其他服务器"]
    E --> I["确保备份可用"]
    
    F --> J["节省存储空间"]
    G --> K["恢复简单快速"]
    H --> L["防止本地灾难"]

备份原则:

  1. 3-2-1 原则:3份副本,2种介质,1份异地
  2. 定期测试:每季度至少测试一次恢复流程
  3. 加密敏感数据:使用 gpg 或 zip -e 加密备份
  4. 监控备份:检查 cron 日志,确保备份成功

10.10.4 清理旧备份

1
2
3
4
5
6
7
8
9
# 只保留最近7天的备份(添加到 crontab)
0 4 * * * find /tmp/backups -mtime +7 -delete

# 或者在脚本中加入清理逻辑
# backup.sh 中添加:
# 删除7天前的备份(安全写法)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Cleaned up backups older than 7 days"

⚠️ 安全提示:删除文件时建议使用 -delete 或 -exec rm {} \;,避免使用 | xargs rm(文件名有空格会出错)。


本章小结

本章我们学习了 Linux 中的压缩与归档工具!

tar 打包工具:

选项作用
-c创建归档
-x解包归档
-t查看归档内容
-v显示过程
-f指定文件名
-zgzip 压缩/解压
-jbzip2 压缩/解压
-Jxz 压缩/解压
-C解压到指定目录

压缩工具对比:

工具格式特点
gzip.gz最流行,速度快
bzip2.bz2压缩比较高
xz.xz压缩比最高
zip.zipWindows 兼容
7z.7z压缩比很高

zip/unzip 命令:

命令作用
zip -r archive.zip dir/打包压缩
unzip archive.zip解压
unzip -l archive.zip查看内容

7z 命令:

命令作用
7z a archive.7z files创建压缩包
7z x archive.7z解压
7z l archive.7z查看内容

压缩级别:

1
2
3
gzip -1  # 最快
gzip -6  # 默认
gzip -9  # 最高压缩

实战命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 打包压缩
tar -czvf backup.tar.gz /path/to/dir

# 查看内容
tar -tzf backup.tar.gz

# 解压
tar -xzvf backup.tar.gz

# 跨格式解压(tar 自动识别格式)
tar -xf backup.tar.xz

恭喜你完成了 Linux 基础教程的十章内容!🎉

你已经学会了:

  • 终端与 Shell 基础
  • 文件与目录操作
  • 文件查看与编辑器
  • 文件查找与文本搜索
  • 管道与重定向
  • 压缩与归档

继续加油,Linux 大神之路,从这里开始!🚀

最后修改 September 19, 2026: 更新 (3489033b1)