跳转至

文件压缩与解压缩

概述

在 Linux 系统中,文件的打包、压缩和解压是数据备份、日志归档和软件分发的常见操作。本文详细介绍了 tar、zip 等工具的使用方法,以及不同压缩格式的特点和适用场景。

打包和压缩的区别

很多人将"打包"和"压缩"混为一谈,实际上它们是完全不同的两个概念:

概念 英文 作用 结果
打包 pack / archive 将多个文件或目录合并成一个文件 减少文件个数,方便传输和管理
压缩 compress 通过算法减小单个文件的体积 减少文件占用的存储空间

类比理解: - 打包 = 把散落的物品装进一个箱子(体积不变,但方便搬运) - 压缩 = 用真空袋把棉被压扁(体积变小,但需要解压才能使用)

常见文件的压缩率

不同类型的文件,压缩效果差异很大:

文件类型 格式 压缩特点
图片 BMP、GIF、PNG、JPEG、JPG BMP无压缩可大幅压缩;PNG/JPG本身已压缩,再压缩效果差
音频 APE、FLAC、MP3 MP3是有损压缩,FLAC是无损压缩
视频 RMVB、AVI、MP4 视频编码本身压缩率已很高,再压缩空间不大

压缩率计算公式

压缩率 = 压缩后体积 / 压缩前体积
压缩率越小,说明压缩效果越好。

压缩的其他作用

  1. 减小体积:节省磁盘空间和网络带宽
  2. 方便传输:多个文件打包后便于一次性发送
  3. 添加密码:部分压缩格式支持加密(如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用法示例

打包(不压缩)

tar -cvf test.tar test/       # 将test目录打包为test.tar

解包

tar -xvf test.tar             # 解压test.tar到当前目录

打包并用gzip压缩

tar -zcvf test.tar.gz test/   # 打包并gzip压缩(.tar.gz或.tgz)

解压gzip压缩包

tar -zxvf test.tar.gz         # 解压gzip压缩的包
tar -zxvf test.tar.gz -C aaa  # 解压到aaa目录(-C指定目标目录)

打包并用bzip2压缩

tar -jcvf test.tar.bz2 test/  # 打包并bzip2压缩

解压bzip2压缩包

tar -jxvf test.tar.bz2        # 解压bzip2压缩的包
tar -jxvf test.tar.bz2 -C aaa # 解压到aaa目录

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 test.zip *.txt            # 将所有txt文件压缩为test.zip
zip -r test.zip dir/          # 递归压缩目录(-r = recursive)

解压缩

unzip test.zip                # 解压到当前目录
unzip test.zip -d bbb         # 解压到bbb目录(-d指定目标目录)

添加密码

zip -rP 123456 test.zip *.txt # 用密码123456加密压缩(-P大写)
unzip -P 123456 test.zip      # 用密码解压

专业解读: - zip的加密强度较弱(传统zip加密已被破解),敏感数据建议使用gpg或7z的AES-256加密 - 解压时如果目标目录不存在,unzip会自动创建 - 可以用 unzip -l test.zip 查看压缩包内容而不解压


安全测试视角:压缩包炸弹 (Zip Bomb) 压缩包炸弹是一种拒绝服务攻击手段,通过极小的压缩文件解压后占用巨大的磁盘空间或内存: - 著名的 42.zip 只有 42KB,但解压后可达 4.5PB - 在 Web 应用中,如果允许用户上传压缩文件并在服务端解压,未做大小限制可能导致服务器资源耗尽 - 防御方法:解压前检查压缩比,设置解压大小上限,在沙箱环境中处理不可信压缩文件

安全测试视角:压缩文件的隐藏数据 攻击者可能利用压缩文件隐藏恶意代码或数据: - 在 zip 文件中嵌入路径穿越序列,解压时覆盖系统文件 - 利用压缩文件的注释区域隐藏 C2 通信地址或指令 - 在渗透测试中,检查可疑压缩文件的内容和元数据是恶意软件分析的一部分