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 文件扩展名

扩展名工具解压命令
.tartartar -xf
.tar.gz / .tgztar + gziptar -xzf
.tar.bz2 / .tbz2tar + bzip2tar -xjf
.tar.xztar + xztar -xJf
.gzgzipgunzip
.bz2bzip2bunzip2
.xzxzunxz
.zipzipunzip
.rarrarunrar
.7z7zip7z 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解压zipunzip 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 练习题

  1. 基础练习: 打包项目目录并使用gzip压缩
  2. 进阶练习: 创建备份脚本,自动打包并添加日期标记
  3. 实战练习: 备份数据库并压缩,然后在测试环境恢复
  4. 挑战练习: 编写脚本,自动归档7天前的日志并上传到云存储

🎉 恭喜!你已经掌握了文件压缩与归档!

继续学习 → 第7章:文件权限系统