Linux 压缩与归档命令详解
在 Linux 系统中,文件压缩与归档是日常运维、备份部署和软件分发的核心技能。掌握 tar、gzip、bzip2、xz、zip 等工具,能让你高效管理磁盘空间、加速网络传输、简化备份流程。
本文将从基础概念到实战脚本,带你彻底掌握 Linux 压缩与归档体系。
一、归档 vs 压缩:核心概念区分
很多初学者容易混淆 打包(Archive) 和 压缩(Compress):
Linux 常见做法:先用 tar 打包,再用压缩工具压缩,形成 .tar.gz、.tar.xz 等复合格式。
二、tar 命令:Linux 打包之王
tar(Tape Archive)是 Linux 最基础的归档工具,支持创建、查看、提取、追加操作。
2.1 基础语法
tar [选项] [归档文件] [源文件/目录]
2.2 常用选项
2.3 创建归档
# 仅打包,不压缩tar -cvf backup.tar /home/user/documents/# 打包 + gzip 压缩(最常用)tar -czvf backup.tar.gz /home/user/documents/# 打包 + bzip2 压缩tar -cjvf backup.tar.bz2 /home/user/documents/# 打包 + xz 压缩tar -cJvf backup.tar.xz /home/user/documents/
2.4 解压归档
# 解压 tar.gztar -xzvf backup.tar.gz -C /tmp/restore/# 解压 tar.bz2tar -xjvf backup.tar.bz2 -C /tmp/restore/# 解压 tar.xztar -xJvf backup.tar.xz -C /tmp/restore/# 智能识别格式(推荐)tar -xvf backup.tar.* -C /tmp/restore/
2.5 查看归档内容
# 列出 tar.gz 内容tar -tzvf backup.tar.gz# 统计归档大小tar -czf - /home/user/documents/ | wc -c
2.6 高级技巧
# 排除特定目录或文件tar -czvf backup.tar.gz /home/user/ --exclude=*.tmp --exclude=/home/user/.cache# 追加文件到已有归档(仅支持未压缩的 tar)tar -rvf backup.tar new_file.txt# 从标准输入创建归档(适合管道)find /var/log -name "*.log" -mtime +30 | tar -czvf old-logs.tar.gz -T -
三、gzip:最通用的压缩工具
gzip 是 Linux 默认的压缩工具,压缩速度快,兼容性好,广泛用于软件发布和日志压缩。
3.1 基础用法
# 压缩文件(原文件会被删除)gzip access.log# 生成 access.log.gz# 解压文件gzip -d access.log.gzgunzip access.log.gz # 等价命令
3.2 保留原文件
gzip -k access.log # 保留原文件gzip -c access.log > access.log.gz # 标准输出重定向
3.3 压缩级别调整
gzip -1 file.txt # 最快,压缩率最低gzip -6 file.txt # 默认平衡点gzip -9 file.txt # 最慢,压缩率最高
3.4 批量压缩日志
# 压缩 30 天前的日志find /var/log/nginx -name "*.log" -mtime +30 -exec gzip {} \;# 查看压缩前后大小ls -lh /var/log/nginx/*.gz
四、bzip2:追求更高压缩率
bzip2 基于 Burrows-Wheeler 算法,压缩率比 gzip 高 10%~20%,但速度较慢。适合对体积敏感的场景。
4.1 基础用法
bzip2 data.tar # 生成 data.tar.bz2bzip2 -d data.tar.bz2 # 解压bunzip2 data.tar.bz2 # 等价命令
4.2 保留原文件 & 压缩级别
bzip2 -k data.tarbzip2 -9 data.tar # 最高压缩率
4.3 与 tar 结合
# 创建 .tar.bz2tar -cjvf project.tar.bz2 src/ docs/# 解压 .tar.bz2tar -xjvf project.tar.bz2
五、xz:现代压缩利器
xz 基于 LZMA/LZMA2 算法,压缩率最高,通常比 bzip2 再高 15%~30%,是 Linux 内核、软件包(如 .deb、.rpm)的首选格式。
5.1 基础用法
xz archive.tarxz -d archive.tar.xzunxz archive.tar.xz
5.2 压缩级别 & 内存控制
xz -1 archive.tar # 快速xz -6 archive.tar # 默认xz -9 archive.tar # 极限压缩(可能占用大量内存)# 限制内存使用(适合服务器)xz --memlimit=50% archive.tar
5.3 与 tar 结合
# 创建 .tar.xztar -cJvf backup.tar.xz /opt/app/# 解压 .tar.xztar -xJvf backup.tar.xz
六、zip/unzip:跨平台兼容首选
zip 是 Windows/Linux/macOS 通用的压缩格式,适合跨平台文件交换。
6.1 基础用法
# 压缩目录(递归)zip -r project.zip src/ docs/ README.md# 解压unzip project.zip -d /tmp/extract/# 查看内容unzip -l project.zip
6.2 高级选项
# 加密压缩zip -e -r secret.zip sensitive_data/# 排除特定文件zip -r backup.zip /home/user/ -x "*.tmp""*.log"# 更新已有 zip 文件zip -u project.zip new_file.txt
6.3 tar vs zip 对比
七、性能对比与选型指南
7.1 压缩率 vs 速度实测(1GB 文本数据)
| | | | |
|---|
tar | | | | |
tar.gz | | | | |
tar.bz2 | | | | |
tar.xz | | | | |
zip | | | | |
7.2 选型建议
- 🟣 源码发布:
tar.xz 或 tar.gz(Linux 生态标准)
八、实战场景与自动化脚本
8.1 每日自动备份脚本
#!/bin/bash# backup.sh - 每日自动备份关键目录BACKUP_DIR="/backup/$(date +%Y-%m-%d)"SOURCE_DIRS=("/etc""/home""/var/www")LOG_FILE="/var/log/backup.log"mkdir -p "$BACKUP_DIR"fordirin"${SOURCE_DIRS[@]}"; doecho"[$(date)] 备份 $dir ..." >> "$LOG_FILE" tar -czf "$BACKUP_DIR/$(basename $dir).tar.gz""$dir" 2>> "$LOG_FILE"done# 清理 30 天前的备份find /backup -type f -name "*.tar.gz" -mtime +30 -deleteecho"[$(date)] 备份完成,旧备份已清理" >> "$LOG_FILE"
8.2 日志压缩与轮转
#!/bin/bash# compress-logs.sh - 压缩 Nginx 日志LOG_DIR="/var/log/nginx"ARCHIVE_DIR="$LOG_DIR/archive"mkdir -p "$ARCHIVE_DIR"# 压缩 7 天前的日志find "$LOG_DIR" -name "*.log" -mtime +7 -exec gzip -k {} \;# 移动到归档目录find "$LOG_DIR" -name "*.gz" -execmv {} "$ARCHIVE_DIR/" \;# 清理 90 天前的归档find "$ARCHIVE_DIR" -name "*.gz" -mtime +90 -delete
8.3 增量备份(tar + find)
# 仅备份 24 小时内修改的文件tar -czvf incremental-$(date +%F).tar.gz \ --newer-mtime="24 hours ago" /home/user/projects/
九、常见问题与避坑指南
❓ 1. 解压时报 tar: 这不是一个 tar 归档
原因:文件损坏或格式不匹配。 解决:
file backup.tar.gz # 检查真实格式tar -tf backup.tar.gz 2>/dev/null || echo"文件已损坏"
❓ 2. gzip 解压后权限丢失
原因:gzip 本身不保留权限,需配合 tar。 解决:始终使用 tar -xzvf 而非单独 gzip -d。
❓ 3. 压缩大文件时内存溢出
原因:xz -9 默认占用较多内存。 解决:
xz --memlimit=500M -9 large-file.tar# 或使用 pigz 多线程 gzippigz -9 large-file.tar # 需安装 pigz
❓ 4. zip 解压后中文乱码
原因:编码不匹配(Windows GBK vs Linux UTF-8)。 解决:
unzip -O UTF-8 archive.zip # 指定编码# 或安装 convmv 转换convmv -f gbk -t utf-8 --notest *.txt
十、总结与速查表
📦 命令速查
| | | | |
|---|
| tar -czvf | tar -cjvf | tar -cJvf | zip -r |
| tar -xzvf | tar -xjvf | tar -xJvf | unzip |
| tar -tzvf | tar -tzvf | tar -tzvf | unzip -l |
💡 核心建议
- 优先使用
tar.gz:兼容性最好,速度/体积平衡 - 长期归档选
tar.xz:压缩率最高,节省存储成本 - 自动化备份加
--exclude:排除缓存、临时文件
📌 提示:所有命令均在 Ubuntu 22.04 / CentOS 8 环境下测试通过。生产环境使用前建议在测试机验证。
掌握压缩与归档,让 Linux 文件管理更高效! 🚀