【第4章】压缩命令
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(默认)、zip、tar、gzip、bzip2、xz-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。 x与e的区别是新手最常踩的坑: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/Jtar 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.zipzip -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。