文件压缩与解压缩¶
概述¶
在 Linux 系统中,文件的打包、压缩和解压是数据备份、日志归档和软件分发的常见操作。本文详细介绍了 tar、zip 等工具的使用方法,以及不同压缩格式的特点和适用场景。
打包和压缩的区别¶
很多人将"打包"和"压缩"混为一谈,实际上它们是完全不同的两个概念:
| 概念 | 英文 | 作用 | 结果 |
|---|---|---|---|
| 打包 | pack / archive | 将多个文件或目录合并成一个文件 | 减少文件个数,方便传输和管理 |
| 压缩 | compress | 通过算法减小单个文件的体积 | 减少文件占用的存储空间 |
类比理解: - 打包 = 把散落的物品装进一个箱子(体积不变,但方便搬运) - 压缩 = 用真空袋把棉被压扁(体积变小,但需要解压才能使用)
常见文件的压缩率¶
不同类型的文件,压缩效果差异很大:
| 文件类型 | 格式 | 压缩特点 |
|---|---|---|
| 图片 | BMP、GIF、PNG、JPEG、JPG | BMP无压缩可大幅压缩;PNG/JPG本身已压缩,再压缩效果差 |
| 音频 | APE、FLAC、MP3 | MP3是有损压缩,FLAC是无损压缩 |
| 视频 | RMVB、AVI、MP4 | 视频编码本身压缩率已很高,再压缩空间不大 |
压缩率计算公式:
压缩率越小,说明压缩效果越好。压缩的其他作用¶
- 减小体积:节省磁盘空间和网络带宽
- 方便传输:多个文件打包后便于一次性发送
- 添加密码:部分压缩格式支持加密(如zip、7z)
注意:打包、解包、压缩、解压都需要消耗CPU时间和内存资源,对于大文件或大量文件,操作可能需要较长时间。
常见压缩格式¶
不同场景的压缩格式¶
| 场景 | 常用格式 | 说明 |
|---|---|---|
| HTTP传输 | gzip、deflate、br(Brotli)、identity | Web服务器与浏览器之间的内容编码协商 |
| Windows | zip、rar、7z | winrar、360压缩、Bandizip、7-Zip等工具 |
| Linux | gzip(.gz)、bzip2(.bz2)、zip | tar命令结合gzip/bzip2是最常用的方式 |
Linux常见压缩格式对比¶
| 格式 | 命令工具 | 特点 |
|---|---|---|
| .tar | tar | 仅打包,不压缩 |
| .tar.gz / .tgz | tar + gzip | 打包后用gzip压缩,速度快,压缩率适中 |
| .tar.bz2 | tar + bzip2 | 打包后用bzip2压缩,压缩率最高,但速度最慢 |
| .zip | zip/unzip | 跨平台兼容性好,Windows/Linux通用 |
压缩效果对比:
- 压缩后体积:tar.bz2 < tar.gz < tar(不压缩)
- 压缩/解压速度:tar.bz2 最慢 < tar(不压缩,最快) < tar.gz 较快
专业解读:gzip使用DEFLATE算法,压缩速度快,适合日志文件等需要频繁压缩解压的场景。bzip2使用Burrows-Wheeler变换,压缩率更高但速度较慢,适合对体积敏感但不频繁操作的场景。
tar 命令¶
全称:Tape Archive(磁带归档)
tar是Linux中最经典的打包工具,最初设计用于磁带备份。
tar常用选项¶
| 选项 | 作用 | 英文/记忆 |
|---|---|---|
-c |
创建打包文件 | create |
-v |
显示打包或解包的详细信息 | verbose |
-f |
指定文件名称(必须放到所有选项最后) | file |
-z |
用gzip压缩或解压缩 | gzip |
-j |
用bzip2压缩或解压缩 | bzip2 |
-x |
解包/解压 | extract |
-C |
解压到指定目录 | Change directory |
-t |
仅查看压缩包内容,不解压 | list |
-r |
追加文件到已有包中 | append |
-u |
更新包中的文件 | update |
注意:
-f选项后面必须紧跟文件名,所以通常把-f放在选项的最后,如-zcvf而不是-zfcv。
tar用法示例¶
打包(不压缩):
解包:
打包并用gzip压缩:
解压gzip压缩包:
打包并用bzip2压缩:
解压bzip2压缩包:
tar其他操作¶
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 仅查看不解压 | tar -tf test.tar |
列出包内所有文件 |
| 追加文件 | tar -rf test.tar *.gif |
将gif文件追加到test.tar |
| 替换文件 | tar -uf test.tar huaji.gif |
用新的huaji.gif替换包内同名文件 |
tar加密¶
tar本身不支持加密,但可以结合openssl实现:
# 加密打包(des3算法,密码123456)
tar -zcf - *.txt | openssl des3 -salt -k 123456 | dd of=test.des3
# 解密解压
dd if=test.des3 | openssl des3 -d -k 123456 | tar zxf -
专业解读:
-表示标准输出/输入。第一条命令中,tar -zcf -将打包结果输出到stdout,通过管道传给openssl加密,再传给dd写入文件。解密过程相反。
zip 命令¶
zip格式在Windows和Linux之间通用性最好,适合需要与Windows用户交换文件的场景。
zip用法示例¶
压缩:
解压缩:
添加密码:
专业解读: - zip的加密强度较弱(传统zip加密已被破解),敏感数据建议使用gpg或7z的AES-256加密 - 解压时如果目标目录不存在,unzip会自动创建 - 可以用
unzip -l test.zip查看压缩包内容而不解压
安全测试视角:压缩包炸弹 (Zip Bomb) 压缩包炸弹是一种拒绝服务攻击手段,通过极小的压缩文件解压后占用巨大的磁盘空间或内存: - 著名的
42.zip只有 42KB,但解压后可达 4.5PB - 在 Web 应用中,如果允许用户上传压缩文件并在服务端解压,未做大小限制可能导致服务器资源耗尽 - 防御方法:解压前检查压缩比,设置解压大小上限,在沙箱环境中处理不可信压缩文件安全测试视角:压缩文件的隐藏数据 攻击者可能利用压缩文件隐藏恶意代码或数据: - 在 zip 文件中嵌入路径穿越序列,解压时覆盖系统文件 - 利用压缩文件的注释区域隐藏 C2 通信地址或指令 - 在渗透测试中,检查可疑压缩文件的内容和元数据是恶意软件分析的一部分