为什么我要压缩?
之前我要传个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
| 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
zip -r mydir.zip /path/to/dir
zip -r backup.zip dir1 dir2 dir3
zip -u existing.zip newfile.txt
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
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
| 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: 配合 logrotate 或 crontab 使用
总结
- tar.gz - Linux首选,压缩好,兼容性强
- zip - 跨平台,Windows/Linux通用
- 压缩:
tar -czf,解压:tar -xzf
--exclude 排除不需要的文件
-v 显示过程,方便排错
- 大文件用
split 分卷
- 不要忘记测试压缩包完整性
下一篇:日志查看技巧。