SSH 连上服务器,wget 拉下来一个 nginx-1.24.0.tar.gz,顺手敲了个 unzip,结果报 bad zipfile offset——unzip 只认 zip 包,tar.gz 得用 tar 命令处理。
为什么是两层结构
tar.gz 不是一种压缩算法,而是两步操作的结果:tar 先把一堆文件打包成一个 .tar 归档,gzip 再把这个归档压成 .gz。好处是保留 Linux 的文件权限和目录结构,源码包、备份包都用它。解开也就两种思路:一条命令到位,或者先 gunzip 再拆 tar,效果一样。
最常用的一条命令
tar -zxvf nginx-1.24.0.tar.gz 这一条就是全部:z 表示走 gzip,x 是解开,v 把过程打印出来,f 后面跟文件名。想解到指定目录,末尾加 -C,比如 tar -zxvf nginx-1.24.0.tar.gz -C /opt/soft,目标目录得先存在。反过来打一个目录成 tar.gz,把 x 换成 c 就行:tar -zcvf backup.tar.gz /home/app/logs。
GNU tar 新版本能自动识别压缩格式,直接写 tar -xvf 也能解 tar.gz,连 z 都可以省。只想看包里有什么不动手解,用 ztvf 列清单,t 就是列表模式。
windows 上怎么处理
装了 7-Zip 的话右键就能解,但要解两次:先从 .tar.gz 解出 .tar,再对 .tar 解一次,对应它的两层结构。Win10 1803 以后的系统命令行里其实自带了 tar,tar -zxvf 原样能用;新版 Win11 的资源管理器也开始原生支持这类归档的右键解压,不必再装工具。
报错对着查
提示 gzip: stdin: not in gzip format,多半是文件根本不是 gzip 包,用 file 命令看真实类型;提示 unexpected end of file,一般是包下载了一半,重新下载;解出来的文件权限不对,多半和执行用户有关,别急着拿 root 硬解。解压前先 ztvf 看一眼条目里有没有绝对路径,确认没问题再动手。
日常记住一条就够:linux 上 tar -zxvf 万能起步,windows 上要么 7-Zip 解两遍,要么命令行 tar 一步到位。