Linux 世界里「打包」和「压缩」是两件事:tar 负责把多个文件归档成一个流,gzip/bzip2/xz 负责压缩这个流,7z/zip 则一步到位。搞清这层分工,参数组合就不再是玄学。

7z

7z - 7-Zip 的命令行工具(p7zip),支持 7z/zip/tar/gz 等多种格式,压缩率高且支持 AES-256 加密

常用命令

  • 7z a archive.7z dir/ 打包压缩目录为 archive.7z(a = add,自动递归)
  • 7z a archive.7z file1.txt file2.txt 压缩多个指定文件
  • 7z a -tzip archive.zip dir/ 指定输出为 zip 格式(-t7z/-tzip/-ttar/-tgzip
  • 7z a archive.7z dir/ -xr'!*.log' -xr'!node_modules' 递归排除指定文件/目录
  • 7z a -p -mhe=on secret.7z dir/ 加密压缩:-p 设密码,-mhe=on 连文件名一起加密
  • 7z a -mx=9 archive.7z dir/ 最高压缩率(0 仅存储,9 最高,默认 5)
  • 7z x archive.7z 解压并保留目录结构(最常用)
  • 7z x archive.7z -o/path/to/dir 解压到指定目录(注意 -o 与路径之间无空格
  • 7z e archive.7z 解压但丢弃目录结构,所有文件平铺到当前目录
  • 7z l archive.7z 列出压缩包内容
  • 7z t archive.7z 测试压缩包完整性
  • 7z x archive.zip -mcp=936 解压 GBK 编码的 zip,解决中文文件名乱码

语法格式

7z <command> [OPTIONS] archive [FILE...]

常用 command:a 添加/压缩、x 带路径解压、e 平铺解压、l 列表、t 测试、d 删除、u 更新

OPTIONS

  • -t{type} 指定压缩格式:7z(默认)、ziptargzipbzip2xz
  • -o{dir} 指定解压输出目录(与路径间不能有空格)
  • -p{password} 设置/提供密码,仅 -p 则交互输入
  • -mhe=on 加密文件头(文件名列表也加密,仅 7z 格式支持)
  • -mx={0..9} 压缩级别,9 最高
  • -x!pattern / -xr!pattern 排除文件 / 递归排除(zsh 下感叹号需引号包裹)
  • -y 所有询问自动回答 yes(覆盖等)
  • -r 递归匹配通配符(压缩多文件时配合 *.txt 使用)
  • -mmt=on 多线程压缩(7z 格式默认开启)

备注

  • 安装:macOS brew install sevenzip(命令 7zz,用法相同)或 p7zip;Linux 一般装 p7zip-full
  • xe 的区别是新手最常踩的坑:e 会把所有层级的文件解到同一目录,几乎总是应该用 x
  • 7z 格式采用固实压缩(solid),整体压缩率通常优于 zip 和 gzip,接近 xz;但固实包中取单个文件较慢。加密强度为 AES-256,远强于 zip 传统加密。
  • 7z 格式不保存 Linux 的 owner/权限信息,备份系统文件请用 tar(可再套 7z:tar cf - dir/ | 7z a -si backup.tar.7z)。

bzip2

bzip2 - 基于 Burrows-Wheeler 算法的压缩工具,产生 .bz2 单文件压缩包,压缩率和速度介于 gzip 与 xz 之间

常用命令

  • bzip2 file.txt 压缩文件,生成 file.txt.bz2删除原文件
  • bzip2 -k file.txt 压缩并保留原文件
  • bzip2 -d file.txt.bz2 解压(等价于 bunzip2 file.txt.bz2
  • bzip2 -dk file.txt.bz2 解压并保留 .bz2 原文件
  • bzip2 -9 file.txt 最高压缩率(块大小 900KB,默认即 -9
  • bzip2 -c file.txt > file.txt.bz2 压缩输出到 stdout,不动原文件
  • bzcat file.txt.bz2 不解压直接查看内容(配合 bzless / bzgrep
  • bzip2 -t file.txt.bz2 测试压缩包完整性
  • bzip2recover broken.bz2 从损坏的压缩包中抢救可用的数据块
  • tar cjf dir.tar.bz2 dir/ 打包目录并 bzip2 压缩(小写 j 对应 bzip2)

语法格式

bzip2 [OPTIONS] [FILE...]
bunzip2 [OPTIONS] [FILE...]

OPTIONS

  • -d 解压(decompress)
  • -k 保留输入文件,不删除
  • -c 结果写到标准输出
  • -t 测试完整性
  • -f 强制覆盖已存在的输出文件
  • -1 ~ -9 块大小 100KB ~ 900KB,越大压缩率越高(默认 -9
  • -s 省内存模式,适合低内存环境(速度更慢)
  • -v 显示压缩率等详细信息

备注

  • 定位比较尴尬:压缩率不如 xz、速度不如 gzip,新项目多已转向 xz / zstd;主要用于处理存量 .bz2 文件。
  • bzip2 按块独立压缩,损坏时可用 bzip2recover 找回未损坏的块,这一点比 gzip/xz 更抗损。
  • 多线程可用 pbzip2(需另装),接口与 bzip2 基本兼容。

gzip

gzip - GNU 标准压缩工具,速度快、兼容性最好,产生 .gz 单文件压缩包

常用命令

  • gzip file.txt 压缩文件,生成 file.txt.gz删除原文件
  • gzip -k file.txt 压缩并保留原文件(keep)
  • gzip -9 file.txt 以最高压缩率压缩(1 最快,9 最小,默认 6)
  • gzip -d file.txt.gz 解压(等价于 gunzip file.txt.gz
  • gzip -dk file.txt.gz 解压并保留 .gz 原文件
  • gzip -c file.txt > file.txt.gz 压缩输出到 stdout,不动原文件
  • zcat file.txt.gz 不解压直接查看内容(同 gzip -dc,配合 zless / zgrep 更方便)
  • gzip -l file.txt.gz 查看压缩包内文件的压缩前后大小与压缩率
  • gzip -t file.txt.gz 测试压缩包完整性,无输出即正常
  • gzip -r logs/ 递归压缩目录下的每个文件(各自变成 .gz,不是打包)
  • tar czf dir.tar.gz dir/ 打包目录并 gzip 压缩(gzip 本身不能打包多文件,需配合 tar)

语法格式

gzip [OPTIONS] [FILE...]
gunzip [OPTIONS] [FILE...]

OPTIONS

  • -d 解压(decompress)
  • -k 保留输入文件,不删除
  • -c 结果写到标准输出
  • -r 递归处理目录中的文件
  • -l 列出压缩包信息(大小、压缩率)
  • -t 测试完整性
  • -f 强制覆盖已存在的输出文件
  • -1 ~ -9 压缩级别,-1--fast)最快,-9--best)最小
  • -v 显示压缩率等详细信息

备注

  • gzip 只压缩单个文件,多文件/目录要先用 tar 打包,这也是 .tar.gz 的由来。
  • 三兄弟对比:gzip 最快、压缩率最低;bzip2 居中;xz 最慢、压缩率最高。日志轮转、HTTP 传输等场景基本都用 gzip。
  • 默认行为是压缩后删除原文件,脚本里想保留务必加 -k 或用 -c 重定向。

tar

tar - 归档打包工具,把多文件/目录合并为一个 .tar 包,并可结合 gzip/bzip2/xz 压缩,是 Linux 分发与备份的事实标准

常用命令

  • tar czf archive.tar.gz dir/ 打包目录并用 gzip 压缩(c 创建、z gzip、f 指定文件名)
  • tar xzf archive.tar.gz 解压 .tar.gz 到当前目录
  • tar tzf archive.tar.gz 不解压,列出 .tar.gz 包内容(t = list)
  • tar cjf archive.tar.bz2 dir/ 打包并用 bzip2 压缩(小写 j)
  • tar cJf archive.tar.xz dir/ 打包并用 xz 压缩(大写 J)
  • tar xf archive.tar.xz 万能解压:新版 tar 自动识别 gz/bz2/xz,无需指定 z/j/J
  • tar xzf archive.tar.gz -C /path/to/dir 解压到指定目录(目录必须已存在)
  • tar czf backup.tar.gz dir/ --exclude='*.log' --exclude='node_modules' 压缩时排除匹配的文件/目录
  • tar xzf archive.tar.gz dir/sub/file.txt 只解出包内指定文件
  • tar xzf archive.tar.gz --strip-components=1 -C dest/ 解压时去掉顶层目录(源码包常用)
  • tar czvf archive.tar.gz dir/v 显示处理的文件列表
  • tar rf archive.tar newfile.txt 向未压缩的 .tar 追加文件(已压缩的包不支持追加)
  • tar czf - dir/ | ssh user@host 'tar xzf - -C /backup' 打包流式传到远程机器解开

语法格式

tar [OPTIONS] [-f ARCHIVE] [FILE...]

三大模式互斥,必选其一:-c 创建、-x 解包、-t 查看

OPTIONS

  • -c 创建归档
  • -x 解开归档
  • -t 列出归档内容
  • -f FILE 指定归档文件名(必须紧跟文件名,一般放选项组最后,如 czf
  • -z / -j / -J 通过 gzip / bzip2 / xz 压缩或解压
  • -v 显示处理过程中的文件名
  • -C DIR 先切换到 DIR 再执行(解压到指定目录 / 从指定目录打包)
  • --exclude=PATTERN 排除匹配的文件(需放在被打包路径之前更稳妥)
  • --strip-components=N 解压时剥掉路径前 N 层目录

备注

  • f 后面必须直接跟文件名,tar cfz archive.tar.gz dir/ 会把 z 当成文件名而报错,习惯写成 czf/xzf/tzf
  • GNU 与 BSD tar 差异:macOS 自带 bsdtar,--exclude--strip-components 等行为与 Linux 的 GNU tar 略有差异;macOS 打包会夹带 ._*(AppleDouble)文件,可在打包前 export COPYFILE_DISABLE=1 抑制。GNU tar 解 mac 打的包时可加 --warning=no-unknown-keyword 消除警告。
  • 打包时尽量用相对路径(先 -C 到父目录),避免绝对路径打进包里;解压来历不明的包前先 tar tf 查看,防止文件直接散落到当前目录(tarbomb)。

xz

xz - 高压缩率压缩工具(LZMA2 算法),产生 .xz 单文件压缩包,压缩率最高但速度较慢

常用命令

  • xz file.txt 压缩文件,生成 file.txt.xz删除原文件
  • xz -k file.txt 压缩并保留原文件
  • xz -d file.txt.xz 解压(等价于 unxz file.txt.xz
  • xz -dk file.txt.xz 解压并保留 .xz 原文件
  • xz -9 file.txt 最高压缩率(默认 6;-9e 极限模式,更慢更小)
  • xz -T0 bigfile 多线程压缩,-T0 自动用满所有 CPU 核(大文件提速明显)
  • xz -c file.txt > file.txt.xz 压缩输出到 stdout,不动原文件
  • xzcat file.txt.xz 不解压直接查看内容(配合 xzless / xzgrep
  • xz -l file.txt.xz 查看压缩包信息(大小、压缩率、校验方式)
  • xz -t file.txt.xz 测试压缩包完整性
  • tar cJf dir.tar.xz dir/ 打包目录并 xz 压缩(大写 J 对应 xz)

语法格式

xz [OPTIONS] [FILE...]
unxz [OPTIONS] [FILE...]

OPTIONS

  • -d 解压(decompress)
  • -k 保留输入文件,不删除
  • -c 结果写到标准输出
  • -l 列出压缩包信息
  • -t 测试完整性
  • -f 强制覆盖已存在的输出文件
  • -0 ~ -9 压缩级别,默认 -6;追加 e(如 -9e)为极限模式
  • -T N 使用 N 个线程,-T0 自动检测核数
  • -v 显示进度与压缩率

备注

  • 压缩率通常是三者最高(软件发行包、内核源码普遍用 .tar.xz),代价是压缩很慢、内存占用高:-9 压缩约需 700MB 内存,解压约 65MB,低配机器慎用高等级。
  • 多线程 -T0 会把文件切块并行,压缩率略降但速度成倍提升;注意旧版 xz(< 5.2)不支持多线程。
  • 若追求「压缩率接近 xz、速度接近 gzip」,可考虑 zstd(tar --zstd),近年很多发行版已转向它。

zip

zip / unzip - 与 Windows 互通性最好的压缩打包工具,可直接打包多文件与目录,产生 .zip 压缩包

常用命令

  • zip archive.zip file1.txt file2.txt 把多个文件打包压缩为 archive.zip
  • zip -r archive.zip dir/ 递归压缩整个目录(不加 -r 只会打包空目录本身)
  • zip -r archive.zip dir/ -x "*.log" "*/node_modules/*" 压缩时排除指定文件/目录
  • zip -e secret.zip file.txt 创建带密码的压缩包(交互输入密码)
  • zip -9 -r archive.zip dir/ 以最高压缩率压缩
  • zip -u archive.zip newfile.txt 更新压缩包:新增或替换其中已变化的文件
  • zip -d archive.zip unwanted.txt 从压缩包中删除指定文件
  • unzip archive.zip 解压到当前目录
  • unzip archive.zip -d /path/to/dir 解压到指定目录(不存在会自动创建)
  • unzip -l archive.zip 不解压,列出压缩包内容
  • unzip -o archive.zip 解压并直接覆盖已存在文件,不询问(-n 则一律不覆盖)
  • unzip archive.zip "docs/*" 只解压压缩包内匹配的部分文件
  • unzip -t archive.zip 测试压缩包完整性

语法格式

zip [OPTIONS] archive.zip [FILE...]
unzip [OPTIONS] archive.zip [FILE...] [-d DIR]

OPTIONS

  • -r (zip)递归处理目录
  • -x PATTERN (zip)排除匹配的文件
  • -e (zip)加密(设置密码)
  • -u (zip)更新压缩包中较旧的文件并追加新文件
  • -d (zip)从压缩包删除文件;(unzip)指定解压目标目录
  • -9 / -0 (zip)最高压缩率 / 仅存储不压缩
  • -q 安静模式,不输出文件清单
  • -l (unzip)列出内容不解压
  • -o / -n (unzip)覆盖不询问 / 一律不覆盖
  • -O CHARSET (unzip)指定文件名编码,如 -O GBK

备注

  • 中文乱码:Windows 上压的 zip 文件名多为 GBK 编码,Linux 下解出来乱码,用 unzip -O GBK archive.zip(部分发行版为 -I/-O 需 unzip 6.0+),macOS 可用 ditto -V -x -k --sequesterRsrc archive.zip dir 或改用 7z。
  • zip 对每个文件独立压缩(便于随机存取单个文件),整体压缩率低于 .tar.gz;跨平台分发给 Windows 用户时选 zip,纯 Linux 环境优先 tar 系。
  • -e 的传统 ZipCrypto 加密强度很弱,敏感数据建议用 7z -p 的 AES-256。