最可靠方式是检查文件头魔数0x1f8b——GZIP强制前两字节为1f8b,匹配即确认已压缩;可用head或dd读取校验,封装函数is_gzipped实现自动化判断,并建议结合gzip -t验证完整性,避免误压。

直接检查文件头魔数 0x1f8b 是最可靠、零开销的方式——GZIP 格式强制要求前两个字节为 1f 8b(十六进制),只要文件以这两个字节开头,就说明它已经是 GZIP 压缩格式,不应再被二次压缩。
用 shell 脚本快速判断是否已 gzip 压缩
无需解压、不消耗 CPU,适合在构建脚本或部署流水线中前置校验:
- 读取文件前两个字节:
head -c 2 "$file" | xxd -p或更轻量的dd if="$file" bs=1 count=2 2>/dev/null | od -An -tx1 | tr -d ' ' - 匹配结果是否等于
1f8b(注意小写、无空格) - 封装成函数示例:
is_gzipped() { [ "$(head -c 2 "$1" 2>/dev/null | xxd -p 2>/dev/null)" = "1f8b" ]; }
调用:if is_gzipped script.js; then echo "已压缩,跳过"; else gzip script.js; fi
补充验证:尝试解压并捕获异常(慎用)
魔数校验虽快,但极少数损坏或伪造文件可能绕过。如需更强保障,可做一次轻量解压试探:
- 用
gzip -t "$file" &>/dev/null检查完整性(成功返回 0,失败返回非 0) - 注意:
-t不解压内容,只校验头部和 CRC,开销低且安全 - 不建议用
gunzip -c "$file" >/dev/null——对大文件会实际解压,浪费资源
避免误判的常见陷阱
有些场景看似“像压缩”,实则不是 GZIP,需排除干扰:
-
不要依赖文件后缀:
.gz只是约定,文件可能未压缩或已损坏;反之,无后缀也可能是 gzip 流(如某些 API 响应体) -
区分 Brotli / Zstandard:Brotli 魔数是
fb 00,Zstd 是28 b5 2f fd,不能用同一逻辑判断 - 跳过二进制/媒体文件:JPEG、PNG、MP4 等本身已是高压缩格式,即使魔数不符也不该走 gzip 流程
集成到自动化流程中的建议
在 CI/CD 或静态资源发布脚本中,把校验作为压缩前的守门员:
- 遍历待处理文件列表,对每个文件先运行魔数检查
- 仅对未压缩且 MIME 类型属于文本类(
text/*、application/json、application/javascript)的才执行gzip -k - 记录跳过项:
lr_log "SKIP: $f (already gzipped)",便于审计和排查

















