您现在的位置: 365建站网 > 365文章 > Linux压缩命令怎么用?tar/gzip/xz/zip 参数对照表与解压实战

Linux压缩命令怎么用?tar/gzip/xz/zip 参数对照表与解压实战

文章来源:365jz.com 点击数:42 更新时间:2025-07-08 15:44

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

Linux 压缩命令 tar gzip xz zip 参数对照

一、先搞清一件事:打包 ≠ 压缩

这是理解后面所有命令的基础。Linux 世界把两件事拆成了两个工具:

  • 打包(归档):把多个文件、目录合成一个文件,并保留权限、属主、软链接、时间戳。代表工具是 tar(Tape ARchive)。tar 本身不压缩,一个 test.tar 的体积往往比原始目录总和还略大。
  • 压缩:把一个文件变小。代表工具是 gzip、bzip2、xz。它们不会把多个文件合成一个,而是逐个文件压缩。

所以 .tar.gz 的真实含义是“先用 tar 打成一个包,再用 gzip 把这个包压小”,解压时也必须反过来两步走。而 .zip 则把打包和压缩合并在一个工具里,这也是它在 Windows 上更流行的原因。

二、tar 的参数对照表

tar 的字母参数看似杂乱,其实只有三个动作参数(互斥,必选其一)和若干修饰参数:

  • c create,创建归档;x extract,解出;t list,只列出内容不解压。
  • f file,指定归档文件名。它必须是最后一个字母参数,因为紧跟其后的参数会被当成文件名。
  • v verbose,显示过程;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建站器 »