Linux教程 / 第 60 节
第6章:文件压缩与归档
掌握文件压缩和归档工具,高效管理存储空间
本章目标
- 掌握tar归档命令
- 学会使用gzip、bzip2、xz压缩
- 了解zip压缩工具
- 能够打包和解压项目代码
- 掌握备份和发布流程
6.1 tar归档命令
6.1.1 tar简介
tar = Tape Archive (磁带归档)
tar用于将多个文件打包成一个文件,常与压缩工具结合使用。
6.1.2 基本操作
创建归档
# 创建tar归档 (-c: create, -f: file)
tar -cf archive.tar file1 file2 dir/
# 显示过程 (-v: verbose)
tar -cvf archive.tar file1 file2 dir/
# 归档整个目录
tar -cvf project.tar project/
# 归档多个目录
tar -cvf backup.tar dir1/ dir2/ dir3/
查看归档内容
# 列出归档内容 (-t: list)
tar -tf archive.tar
# 详细列出
tar -tvf archive.tar
解压归档
# 解压 (-x: extract)
tar -xf archive.tar
# 解压到指定目录 (-C)
tar -xf archive.tar -C /tmp/
# 只解压特定文件
tar -xf archive.tar file1.txt
# 显示解压过程
tar -xvf archive.tar
6.1.3 压缩归档
gzip压缩 (.tar.gz / .tgz)
# 创建gzip压缩归档 (-z: gzip)
tar -czf archive.tar.gz dir/
# 解压gzip归档
tar -xzf archive.tar.gz
# 查看内容
tar -tzf archive.tar.gz
bzip2压缩 (.tar.bz2 / .tbz2)
# 创建bzip2压缩归档 (-j: bzip2)
tar -cjf archive.tar.bz2 dir/
# 解压bzip2归档
tar -xjf archive.tar.bz2
# 查看内容
tar -tjf archive.tar.bz2
xz压缩 (.tar.xz)
# 创建xz压缩归档 (-J: xz)
tar -cJf archive.tar.xz dir/
# 解压xz归档
tar -xJf archive.tar.xz
# 查看内容
tar -tJf archive.tar.xz
6.1.4 实用选项
# 排除文件 (--exclude)
tar -czf archive.tar.gz --exclude="*.log" --exclude="node_modules" project/
# 排除文件列表
tar -czf archive.tar.gz --exclude-from=exclude.txt project/
# 保留权限 (-p: preserve permissions)
tar -czpf archive.tar.gz dir/
# 增量备份 (-g: incremental)
tar -czf full-backup.tar.gz -g snapshot.file dir/
tar -czf incremental-backup.tar.gz -g snapshot.file dir/
# 追加文件到归档 (-r: append)
tar -rf archive.tar newfile.txt
# 更新归档中的文件 (-u: update)
tar -uf archive.tar modified-file.txt
6.1.5 常用tar命令组合
# 最常用的命令
tar -czf archive.tar.gz dir/ # 创建gzip压缩归档
tar -xzf archive.tar.gz # 解压gzip归档
tar -tzf archive.tar.gz # 查看gzip归档内容
# 记忆技巧
# c = create (创建)
# x = extract (解压)
# t = list (列出)
# z = gzip
# j = bzip2
# J = xz
# v = verbose (显示过程)
# f = file (必须,指定文件名)
6.2 gzip压缩
6.2.1 gzip基本用法
# 压缩文件 (会删除原文件)
gzip file.txt
# 生成: file.txt.gz
# 保留原文件 (-k: keep)
gzip -k file.txt
# 解压文件
gunzip file.txt.gz
# 或
gzip -d file.txt.gz
# 查看压缩文件内容
zcat file.txt.gz
zless file.txt.gz
zgrep "pattern" file.txt.gz
# 压缩级别 (1-9, 默认6)
gzip -1 file.txt # 最快,压缩率最低
gzip -9 file.txt # 最慢,压缩率最高
# 递归压缩目录下的文件 (-r)
gzip -r dir/
# 显示压缩信息 (-l: list)
gzip -l file.txt.gz
6.3 bzip2压缩
6.3.1 bzip2基本用法
# 压缩文件
bzip2 file.txt
# 生成: file.txt.bz2
# 保留原文件
bzip2 -k file.txt
# 解压文件
bunzip2 file.txt.bz2
# 或
bzip2 -d file.txt.bz2
# 查看压缩文件内容
bzcat file.txt.bz2
bzless file.txt.bz2
bzgrep "pattern" file.txt.bz2
# 压缩级别 (1-9, 默认9)
bzip2 -1 file.txt
bzip2 -9 file.txt
6.4 xz压缩
6.4.1 xz基本用法
# 压缩文件
xz file.txt
# 生成: file.txt.xz
# 保留原文件
xz -k file.txt
# 解压文件
unxz file.txt.xz
# 或
xz -d file.txt.xz
# 查看压缩文件内容
xzcat file.txt.xz
xzless file.txt.xz
xzgrep "pattern" file.txt.xz
# 压缩级别 (0-9, 默认6)
xz -0 file.txt # 最快
xz -9 file.txt # 最慢,压缩率最高
6.5 zip压缩
6.5.1 zip基本用法
# 压缩文件
zip archive.zip file1.txt file2.txt
# 压缩目录 (-r: recursive)
zip -r archive.zip dir/
# 添加文件到现有压缩包
zip archive.zip newfile.txt
# 删除压缩包中的文件 (-d)
zip -d archive.zip file1.txt
# 查看压缩包内容
unzip -l archive.zip
# 解压
unzip archive.zip
# 解压到指定目录 (-d)
unzip archive.zip -d /tmp/
# 解压时不覆盖 (-n)
unzip -n archive.zip
# 压缩级别 (0-9)
zip -0 archive.zip file.txt # 不压缩
zip -9 archive.zip file.txt # 最大压缩
# 加密压缩 (-e)
zip -e secure.zip file.txt
# 会提示输入密码
# 排除文件
zip -r archive.zip dir/ -x "*.log" "node_modules/*"
6.6 压缩工具对比
6.6.1 压缩率和速度对比
| 工具 | 压缩率 | 压缩速度 | 解压速度 | 常用场景 |
|---|---|---|---|---|
| gzip | 中等 | 快 | 快 | 日常使用,日志压缩 |
| bzip2 | 高 | 慢 | 慢 | 需要高压缩率 |
| xz | 最高 | 最慢 | 慢 | 软件发布,长期存储 |
| zip | 中等 | 快 | 快 | 跨平台,Windows兼容 |
6.6.2 文件扩展名
| 扩展名 | 工具 | 解压命令 |
|---|---|---|
.tar | tar | tar -xf |
.tar.gz / .tgz | tar + gzip | tar -xzf |
.tar.bz2 / .tbz2 | tar + bzip2 | tar -xjf |
.tar.xz | tar + xz | tar -xJf |
.gz | gzip | gunzip |
.bz2 | bzip2 | bunzip2 |
.xz | xz | unxz |
.zip | zip | unzip |
.rar | rar | unrar |
.7z | 7zip | 7z x |
6.7 实战场景:打包发布项目代码
场景: 准备项目发布包
# 1. 清理项目
cd ~/projects/my-app
rm -rf node_modules/
rm -rf .git/
rm -f *.log
# 2. 创建排除列表
cat > exclude.txt << 'EOF'
node_modules
.git
*.log
.env
.DS_Store
tmp/
EOF
# 3. 打包项目 (使用gzip)
tar -czf my-app-v1.0.0.tar.gz \
--exclude-from=exclude.txt \
-C .. \
my-app/
# 4. 验证压缩包
tar -tzf my-app-v1.0.0.tar.gz | head -20
# 5. 查看压缩包大小
ls -lh my-app-v1.0.0.tar.gz
# 6. 计算校验和
sha256sum my-app-v1.0.0.tar.gz > my-app-v1.0.0.tar.gz.sha256
# 7. 测试解压
mkdir -p /tmp/test
tar -xzf my-app-v1.0.0.tar.gz -C /tmp/test
ls -la /tmp/test/my-app/
场景: 备份数据库
# 1. 导出数据库
mysqldump -u root -p database_name > backup.sql
# 2. 压缩备份
gzip backup.sql
# 生成: backup.sql.gz
# 3. 添加日期标记
mv backup.sql.gz backup-$(date +%Y%m%d).sql.gz
# 4. 恢复数据库
gunzip backup-20260113.sql.gz
mysql -u root -p database_name < backup-20260113.sql
场景: 日志归档
# 1. 查找旧日志
find /var/log/app -name "*.log" -mtime +7
# 2. 打包旧日志
tar -czf logs-archive-$(date +%Y%m%d).tar.gz \
$(find /var/log/app -name "*.log" -mtime +7)
# 3. 删除已归档的日志
find /var/log/app -name "*.log" -mtime +7 -delete
# 4. 移动归档到备份目录
mv logs-archive-*.tar.gz /backup/logs/
6.8 常用命令速查
| 命令 | 说明 | 示例 |
|---|---|---|
tar -czf | 创建gzip归档 | tar -czf archive.tar.gz dir/ |
tar -xzf | 解压gzip归档 | tar -xzf archive.tar.gz |
tar -tzf | 查看gzip归档 | tar -tzf archive.tar.gz |
gzip | 压缩文件 | gzip file.txt |
gunzip | 解压文件 | gunzip file.txt.gz |
zip -r | 压缩目录 | zip -r archive.zip dir/ |
unzip | 解压zip | unzip archive.zip |
6.9 常见问题与解决
Q1: 如何查看压缩包内容而不解压?
# tar归档
tar -tzf archive.tar.gz
# zip
unzip -l archive.zip
# 查看压缩文件内容
zcat file.txt.gz
bzcat file.txt.bz2
xzcat file.txt.xz
Q2: 如何只解压部分文件?
# tar
tar -xzf archive.tar.gz path/to/file
# unzip
unzip archive.zip "*.txt"
Q3: 压缩时如何保留目录结构?
# 使用相对路径
cd /path/to/parent
tar -czf archive.tar.gz project/
# 或使用-C选项
tar -czf archive.tar.gz -C /path/to/parent project/
Q4: 如何分卷压缩大文件?
# 使用split分割
tar -czf - large-dir/ | split -b 100M - archive.tar.gz.
# 合并并解压
cat archive.tar.gz.* | tar -xzf -
Q5: 如何测试压缩包完整性?
# gzip
gzip -t file.txt.gz
# bzip2
bzip2 -t file.txt.bz2
# zip
unzip -t archive.zip
# tar
tar -tzf archive.tar.gz > /dev/null
6.10 本章小结
本章学习了文件压缩与归档:
✅ tar归档: 打包多个文件,支持多种压缩格式
✅ gzip压缩: 快速压缩,日常使用
✅ bzip2/xz: 高压缩率,适合长期存储
✅ zip压缩: 跨平台兼容
✅ 实战应用: 项目打包、数据备份、日志归档
关键要点
- tar常与gzip/bzip2/xz结合使用
- gzip速度快,xz压缩率高
- 使用–exclude排除不需要的文件
- 备份前验证压缩包完整性
下一步学习
- 第7章: 文件权限系统
6.11 练习题
- 基础练习: 打包项目目录并使用gzip压缩
- 进阶练习: 创建备份脚本,自动打包并添加日期标记
- 实战练习: 备份数据库并压缩,然后在测试环境恢复
- 挑战练习: 编写脚本,自动归档7天前的日志并上传到云存储
🎉 恭喜!你已经掌握了文件压缩与归档!
继续学习 → 第7章:文件权限系统