Linux 压缩与解压完全指南:从 zip 到 xz,再到分片与合并
在 Linux 世界里,压缩与解压几乎是每位用户每天都会遇到的操作——无论是备份文件、传输数据,还是节省磁盘空间。但面对zip、tar、gzip、bzip2、xz等众多工具,你是否曾感到困惑?什么时候该用哪个?如何分割大压缩包?又该如何合并回来?
本文将为你一次性讲透,附带大量实操示例,让你从此得心应手。
一、压缩工具概览
| 工具 | 算法 | 压缩比(越高越慢) | 是否保留源文件 | 是否支持多文件/目录 | 常见后缀 |
|---|---|---|---|---|---|
zip | DEFLATE | 中等 | 是(默认保留) | 是 | .zip |
gzip | DEFLATE | 中等 | 否(默认替换) | 否(仅单文件) | .gz |
bzip2 | BWT + 游程编码 | 较高,较慢 | 否 | 否 | .bz2 |
xz | LZMA2 | 极高,极慢 | 否 | 否 | .xz |
tar | 仅归档(不压缩) | — | 是 | 是 | .tar |
核心概念:
tar本身不是压缩工具,而是归档器(将多个文件/文件夹打包成单个流)。通常我们会将tar与压缩算法结合,生成.tar.gz、.tar.bz2、.tar.xz等。
二、各工具详细用法
1. zip / unzip —— 跨平台通用
zip是 Windows 和 Linux 间最常用的格式,自带压缩并支持目录。
压缩:
# 压缩单个文件ziparchive.zip file1.txt# 压缩多个文件ziparchive.zip file1.txt file2.jpg# 递归压缩整个目录zip-rarchive.zip myfolder/# 添加密码保护zip-esecure.zip secret.txt解压:
unziparchive.zip# 解压到当前目录unziparchive.zip-d/target/# 解压到指定目录unzip-larchive.zip# 仅查看内容,不解压优点:兼容性好;缺点:压缩比一般,不支持 Linux 权限(如可执行位)。
2. gzip / gunzip —— 最常用单文件压缩
gzip只压缩单个文件,不保留源文件(默认替换原文件),速度较快。
# 压缩(替换原文件为 .gz)gzipfile.txt# 生成 file.gz,原 file.txt 消失# 保留原文件(使用 -c 重定向)gzip-cfile.txt>file.txt.gz# 解压(替换 .gz 为原文件)gunzip file.gz# 恢复为 file.txt# 查看压缩文件内容zcat file.gz搭配 tar(最经典组合):
tar-czvfarchive.tar.gz /path/to/folder# 压缩tar-xzvfarchive.tar.gz# 解压参数解释:-c创建,-z通过 gzip,-v显示过程,-f指定文件名。
3. bzip2 / bunzip2 —— 高压缩比,较慢
压缩比优于 gzip,适合对空间敏感的场景,但速度稍慢。
bzip2file.txt# 生成 file.bz2,原文件被替换bzip2-kfile.txt# -k 保留原文件bunzip2 file.bz2# 解压# 与 tar 结合tar-cjvfarchive.tar.bz2 /folder# 压缩tar-xjvfarchive.tar.bz2# 解压4. xz / unxz —— 顶级压缩比,耗时最长
xz提供目前主流工具中最高的压缩比,尤其适合长期归档或网络传输。
xz file.txt# 生成 file.xz,原文件替换xz-kfile.txt# 保留原文件unxz file.xz# 解压# 与 tar 结合tar-cJvfarchive.tar.xz /folder# 压缩(注意大写 J)tar-xJvfarchive.tar.xz# 解压5. tar 独立使用(无压缩)
有时我们只需要归档而不压缩(例如用于备份磁带或后续二次压缩):
tar-cvfarchive.tar /folder# 打包tar-xvfarchive.tar# 解包三、压缩工具性能对比与选择建议
| 使用场景 | 推荐工具 |
|---|---|
| 临时传输,需要快速 | gzip(搭配 tar) |
| 长期存储,不关心时间 | xz(搭配 tar) |
| 需要 Windows 用户打开 | zip |
| 开源软件源码发布 | .tar.gz或.tar.xz(常见) |
| 备份日志文件(单文件) | gzip或xz |
经验法则:
- 压缩时间:
gzip < bzip2 < xz - 压缩比:
xz > bzip2 > gzip - 内存占用:
xz默认较高(可调整),gzip最轻量。
四、压缩包分片与合并
当压缩包过大(例如超过 4GB 无法上传网盘,或邮件附件限制),我们需要将其切分成多个小文件,并在接收端合并还原。
1. 使用split分割任意文件
split是 Linux 自带的文件分割工具,按大小或行数切割。
# 将 big.tar.gz 分割成每个 100MB 的小文件,前缀为 part_split-b100M big.tar.gz part_# 生成文件:part_aa, part_ab, part_ac, ...2. 合并分割文件
使用cat直接按顺序拼接即可恢复原文件:
catpart_*>big.tar.gz然后正常解压:
tar-xzvfbig.tar.gz3. 结合 tar 与 split 一步到位(压缩并分片)
tar-czvf- /large/folder|split-b100M - archive.tar.gz.part_-表示 tar 输出到标准输出,再通过管道传给split。- 生成文件:
archive.tar.gz.part_aa,...
合并(同理):
catarchive.tar.gz.part_*|tar-xzvf-4. 使用zip原生分卷
zip支持直接创建分卷(多部分)压缩包,但跨平台兼容性略差:
zip-r-s100m archive.zip large_folder/- 生成
archive.z01,archive.z02, …,archive.zip - 解压时只需
unzip archive.zip(会自动合并)
五、高级技巧与实用小贴士
1. 查看压缩文件内容而不解压
.zip:unzip -l archive.zip.tar.gz:tar -tzvf archive.tar.gz.tar.bz2:tar -tjvf archive.tar.bz2.tar.xz:tar -tJvf archive.tar.xz
2. 压缩时排除特定文件
tar-czvfbackup.tar.gz /home/user--exclude='*.log'--exclude='cache'3. 解压时保留原始权限和所有权(需要 root)
tar-xzvfarchive.tar.gz --same-owner4. 多线程加速(适用于多核 CPU)
pigz(并行 gzip):tar -cvf - /folder | pigz -p 4 > archive.tar.gzpbzip2(并行 bzip2):tar -cvf - /folder | pbzip2 -p4 > archive.tar.bz2xz本身支持多线程:tar -cJvf archive.tar.xz /folder --xz-options='-T 4'
5. 压缩进度条(使用pv)
tar-czvf- /bigdata|pv-s$(du-sb/bigdata|awk'{print $1}')|split-b1G - data.tar.gz.part_六、总结
| 需求 | 命令速查 |
|---|---|
压缩目录为.tar.gz | tar -czvf out.tar.gz dir/ |
解压.tar.gz | tar -xzvf out.tar.gz |
压缩为.tar.xz | tar -cJvf out.tar.xz dir/ |
解压.tar.xz | tar -xJvf out.tar.xz |
压缩为.zip(带目录) | zip -r out.zip dir/ |
解压.zip | unzip out.zip |
| 大文件分片 | split -b 100M bigfile part_ |
| 合并分片 | cat part_* > bigfile |
| 压缩并分片 | tar -czvf - dir/ | split -b 100M - out.tar.gz.part_ |
| 合并并解压 | cat out.tar.gz.part_* | tar -xzvf - |
掌握这些工具和技巧,你就能在 Linux 下自如应对各种压缩场景。记住:没有最好的工具,只有最适合场景的工具。对于日常备份,我推荐tar + xz(极致空间);对于快速分享,zip或tar.gz更为稳妥。
希望这篇指南对你有帮助!如果你有其他压缩工具的疑问,欢迎在评论区交流讨论🎈。