为什么我要压缩?

之前我要传个10G的项目给朋友,网速只有100KB/s,等了一整晚才传完。如果先压缩到3G,半小时就搞定了。

还有备份服务器,不压缩的话,硬盘很快就满了,压缩能省60%空间。


压缩格式对比

格式 压缩率 速度 兼容性 推荐场景
tar.gz Linux通用 Linux服务器
zip 中等 全平台 跨平台分享
tar.bz2 最好 Linux 最大限度压缩

tar - Linux最常用的

压缩

1
2
3
4
5
6
7
8
9
10
11
# 压缩单个目录
tar -czf backup.tar.gz /var/www/html

# 压缩多个目录
tar -czf backup.tar.gz /dir1 /dir2 /dir3

# 压缩指定文件
tar -czf pics.tar.gz *.jpg

# 显示压缩过程
tar -czvf backup.tar.gz /var/www/html

参数解释:

  • -c - 创建压缩
  • -z - 用gzip压缩
  • -f - 指定文件名
  • -v - 显示过程(verbose)

解压

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

# 解压到指定目录
tar -xzf backup.tar.gz -C /path/to/dest

# 解压并显示过程
tar -xzvf backup.tar.gz

# 只解压某个文件
tar -xzf backup.tar.gz file.txt

# 查看压缩包内容(不解压)
tar -tzf backup.tar.gz

压缩时排除文件

1
2
3
4
5
6
7
8
# 排除日志文件
tar -czf backup.tar.gz --exclude='*.log' /path/to/dir

# 排除多个
tar -czf backup.tar.gz --exclude='*.log' --exclude='*.tmp' /path

# 排除目录
tar -czf backup.tar.gz --exclude='node_modules' --exclude='.git' .

分卷压缩(大文件拆分)

1
2
3
4
5
# 压缩并分成每卷100MB
tar -czf - /path/to/dir | split -b 100M - backup.tar.gz.

# 合并并解压
cat backup.tar.gz.* | tar -xzf -

zip - 跨平台神器

zip最方便的是Windows和Linux都能用,传文件给朋友再也不用担心格式问题了。

压缩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 压缩单个文件
zip myfile.zip file.txt

# 压缩目录(-r递归)
zip -r mydir.zip /path/to/dir

# 压缩多个目录
zip -r backup.zip dir1 dir2 dir3

# 添加到已有压缩包
zip -u existing.zip newfile.txt

# 设置压缩级别(0不压缩,9最大压缩)
zip -9 backup.zip /path # 最大压缩,最慢
zip -1 backup.zip /path # 最快,但文件大

解压

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 解压
unzip file.zip

# 解压到指定目录
unzip file.zip -d /path/to/dest

# 解压并保持目录结构
unzip -o file.zip # -o覆盖已存在文件

# 只解压某个文件
unzip file.zip file.txt

# 查看压缩包内容
unzip -l file.zip

# 测试压缩包是否损坏
unzip -t file.zip

加密压缩

1
2
3
4
5
6
zip -e secret.zip file.txt
# 输入密码

# 解密解压
unzip secret.zip
# 输入密码

实用技巧

技巧1:压缩比测试

想知道不同格式的压缩效果:

1
2
3
4
5
6
7
8
9
10
# 创建测试文件
dd if=/dev/zero of=testfile bs=1M count=100

# 测试不同格式
tar -czf test.tar.gz testfile
zip test.zip testfile
tar -cjf test.tar.bz2 testfile

# 查看大小
ls -lh test.*

你会发现:

  • 原始:100M
  • tar.gz:约300K(0.3%)
  • zip:约30M(30%)
  • tar.bz2:约10K(0.01%),但时间最长

技巧2:快速备份网站

1
2
3
4
5
6
7
8
#!/bin/bash
# 备份脚本
DATE=$(date +%Y%m%d)
tar -czf /backup/website_$DATE.tar.gz \
--exclude='*.log' \
--exclude='node_modules' \
--exclude='.git' \
/var/www/html

技巧3:边压缩边传输到另一台服务器

1
2
3
4
5
# 本地压缩,直接传到远程
tar -czf - /path/to/dir | ssh user@remote "cat > /remote/backup.tar.gz"

# 从远程压缩并下载
ssh user@remote "tar -czf - /remote/path" > local_backup.tar.gz

技巧4:只压缩修改过的文件

1
2
# 只压缩最近7天修改的文件
find /path -mtime -7 -print0 | tar -czf recent.tar.gz --null -T -

踩坑经验

坑1:解压覆盖文件

  • tar -xzf 会直接覆盖,没有提示
  • 解决:先用 tar -tzf 看里面有什么,再决定

坑2:路径太长压缩失败

  • tar默认路径不超过256字符
  • 解决:cd到高一级目录再压缩

坑3:zip解压中文乱码

  • Windows和Linux编码不同
  • 解决:unzip -O GBK file.zip

坑4:压缩包损坏

  • 网络传输中断
  • 解决:重新传输,或用 tar -tzf 测试完整性

常见问题

Q: tar和tar.gz有什么区别?
A: tar只是打包,不压缩;tar.gz是tar打包后用gzip压缩

Q: 如何解压.rpm或.deb?
A: 这些是安装包,不是压缩包,用包管理器安装

Q: 压缩时CPU占用太高怎么办?
A: 用 nice -n 19 tar -czf backup.tar.gz /path 降低优先级

Q: 如何自动定期压缩老日志?
A: 配合 logrotatecrontab 使用


总结

  • tar.gz - Linux首选,压缩好,兼容性强
  • zip - 跨平台,Windows/Linux通用
  • 压缩:tar -czf,解压:tar -xzf
  • --exclude 排除不需要的文件
  • -v 显示过程,方便排错
  • 大文件用 split 分卷
  • 不要忘记测试压缩包完整性

下一篇:日志查看技巧。