Linux压缩命令怎么用?tar/gzip/xz/zip 参数对照表与解压实战
“把目录压缩一下发给我”,这句话在 Linux 运维里每天都在发生,但相当多的人会把 tar 和 gzip 的职责搞混,结果要么压不出体积,要么解压时报 Unrecognized archive format。本文按“先理解格式、再记参数、最后排错”的顺序,把 Linux 下最常用的压缩解压命令做一次完整梳理,所有命令均可在主流发行版直接复制运行。

一、先搞清一件事:打包 ≠ 压缩
这是理解后面所有命令的基础。Linux 世界把两件事拆成了两个工具:
- 打包(归档):把多个文件、目录合成一个文件,并保留权限、属主、软链接、时间戳。代表工具是
tar(Tape ARchive)。tar本身不压缩,一个test.tar的体积往往比原始目录总和还略大。 - 压缩:把一个文件变小。代表工具是
gzip、bzip2、xz。它们不会把多个文件合成一个,而是逐个文件压缩。
所以 .tar.gz 的真实含义是“先用 tar 打成一个包,再用 gzip 把这个包压小”,解压时也必须反过来两步走。而 .zip 则把打包和压缩合并在一个工具里,这也是它在 Windows 上更流行的原因。
二、tar 的参数对照表
tar 的字母参数看似杂乱,其实只有三个动作参数(互斥,必选其一)和若干修饰参数:
ccreate,创建归档;xextract,解出;tlist,只列出内容不解压。ffile,指定归档文件名。它必须是最后一个字母参数,因为紧跟其后的参数会被当成文件名。vverbose,显示过程;j调 bzip2;J调 xz;z调 gzip。C 目录(大写)切换执行目录,常用来避免归档里带上一层路径;-p解压时保留原权限。
四条最高频命令,建议直接背下来:
- 压缩目录:
tar -czvf backup.tar.gz /var/log/nginx - 查看内容:
tar -tzvf backup.tar.gz(不解压,先看里面到底有什么) - 解压到当前目录:
tar -xzvf backup.tar.gz - 解压到指定目录:
tar -xzvf backup.tar.gz -C /opt/app(注意 /opt/app 必须已存在,tar 不会自动建目录)
补充两个实用细节:归档里默认带绝对路径(tar -tvf 看到 /var/log/... 就是这样),解压时可能覆盖系统文件,安全做法是加 --strip-components=1 去掉首层目录,或改用相对路径打包。另外 tar zxvf a.tar.gz(不带横杠)是 GNU tar 保留的旧式写法,能跑但脚本里不建议用。
三、gzip / bzip2 / xz:压缩率与速度的取舍
这三者只处理单个文件,压缩后原文件默认被删除(想保留用 gzip -k 文件名)。它们都支持 -1(最快、压缩率最低)到 -9(最慢、压缩率最高)的级别,默认 -6。
gzip:速度最快,几乎所有系统预装,网络传输(Nginx 的 gzip 模块)默认就是它。bzip2:压缩率高于 gzip,但慢,且早年是单线程实现,现在使用率逐渐下降。xz:压缩率最高,文本类日志实测通常比 gzip 再小 25%~35%,代价是慢和吃内存。
想知道某个压缩包能省多少空间,不用真解压:gzip -l access.log.gz 会直接列出压缩前字节数、压缩后字节数和压缩比。日志归档选级别时,一个常见组合是“当天用 gzip -6 保证速度,历史归档用 xz -9 换空间”。
多线程加速是提升大目录备份效率的关键:xz 原生支持 -T 0(按 CPU 核数并行);gzip 本身单线程,需要装 pigz,用法是把它塞进 tar:tar -I pigz -cf backup.tar.gz /data/www,在 8 核机器上这一步通常能把备份耗时压到原来的三分之一左右。
四、zip / unzip:跨平台和中文乱码
要和 Windows 交换文件时,zip 更省事,它打包压缩一步到位:
- 递归压缩目录:
zip -r site.zip ./public_html,加-x "*.log"可以排除文件。 - 解压:
unzip site.zip -d /opt/www,-o覆盖不提示,-n永不覆盖。 - 加密码:
zip -e secret.zip a.txt(注意这是老式弱加密,只防君子;要安全请用7z -p开 AES-256)。
最常见的坑是解压 Windows 传来的 zip 后中文文件名全是乱码。原因是 Windows 用 GBK 编码文件名、而 Linux 的 unzip 默认按当前 locale 解析。解决办法是显式指定:unzip -O gbk site.zip(部分版本写作 -I gbk),或者改用 7z x site.zip,它对编码的兼容性更好。
五、7z:更高压缩率与分卷
安装 p7zip 后命令是 7z(Debian 系可能只有 7za)。它一个工具支持 7z/zip/tar.gz/arj 等多种格式的读写:
- 最高压缩:
7z a -t7z -m0=lzma2 -mx=9 -ms=on backup.7z ./www,其中-m0=lzma2指定算法、-mx=9指定级别、-ms=on开启固实压缩(多同类文件一起压,效果显著)。 - 分卷(刻盘、绕开上传限制):
7z a -v100m big.7z ./iso会切成big.7z.001/.002/...,解压时只要把.001交给7z x big.7z.001即可自动续接。 - tar 方案的分卷用
split:tar -czf - /data | split -b 700M - part_,恢复时先cat part_* > all.tar.gz再正常解压。
六、拿到一个不知道格式的文件怎么办
别猜,直接问系统:
file package.bin会返回 “gzip compressed data”“Zip archive data, ... using deflate” 之类的真实类型,这是判断“扩展名骗人”的最快手段。很多.tar.gz解压失败的根因就是下载到了 404 页面或者被网关拦截的 HTML,扩展名却是 gz。7z l package.bin能列出压缩包内容,进一步确认结构。- 压缩包类型识别工具包
unarchiver(提供lsar/unar)适合处理 rar、arj 等冷门格式。
七、高频报错与处理顺序
- tar: Unrecognized archive format:先用
file看真实类型;若结果是 HTML/Text,说明下载不完整,重下;若结果是 Zip,则应改用unzip而不是tar -xzf。 - gzip: invalid compressed data--format violated:文件损坏,常见于 FTP 用 ASCII 模式传了二进制包;改用二进制模式重传,或
gzip -t 文件.gz逐个校验。 - No space left on device:解压需要“包 + 解出来的内容”双份空间,用
df -h .看目标分区,必要时tar -xzvf a.tar.gz --to-stdout > /mnt/big/file直接输出到大盘,或边解边删。 - Cannot open: Permission denied:读取用
sudo;但更常见的是 tar 解压后把原属主 uid 写回来,非 root 下应加--no-same-owner。 - 解压后目录多出一层:前面提到的绝对路径问题,用
--strip-components=N修正。
八、常见问题 FAQ
问:为什么 tar -czvf a.tar.gz *.log 没有把目录里的子目录带上?
答:通配符 *.log 由 shell 展开,只匹配当前层。要递归打包应直接写目录名 tar -czvf a.tar.gz ./logs。
问:.tar.gz 和 .tgz 有区别吗?
答:没有,只是缩写扩展名,命令完全相同。
问:备份网站时想跳过最大的视频目录,怎么做?
答:tar --exclude='./uploads/video' --exclude='*.cache' -czvf bak.tar.gz ./www,注意 --exclude 要写在 -czvf 之前或紧跟归档名之前,位置错会失效。
问:压缩率到底该选哪个?
答:日常交互选 gzip,长期归档选 xz -9 或 7z -mx=9,需要和 Windows 用户互传选 zip。CPU 紧张的大目录备份一律上 pigz。
一句话总结:tar 管“合”,gzip/xz 管“小”,扩展名只是给人看的、判断格式永远用 file。把这三点记住,Linux 下九成以上的压缩解压问题都可以自己解决。
生产内容,同时打通搜索引擎(SEO)与AI搜索引擎(GEO)流量入口的软件! 点击进入365建站器 »
