linux无统一文件压缩率指标,需按格式分别处理:zip用zipinfo -t,gz用gzip -l,tar.gz等需手动估算,zram数据与文件压缩无关。

Linux 没有统一的“文件压缩率”全局指标,不同压缩格式(.zip、.gz、.bz2、.zst)的统计方式完全不同,必须按格式分别处理。
zipinfo -t 查看 .zip 文件整体压缩率
zipinfo -t 是最直接的方式,它会汇总显示压缩前后总大小和整体压缩率:
- 输出包含三行关键数据:
compressed(压缩后字节数)、uncompressed(解压后字节数)、compression ratio(百分比形式,如65.2%) - 注意:这个比率是整个 zip 包的加权平均值,不是每个文件单独的压缩率
- 如果只关心数值,可用
zipinfo -t archive.zip | tail -n 1 | awk '{print $4}'提取最后一行的百分比 - 不支持通配符批量处理,每个
.zip文件需单独执行
gzip -l 查看 .gz 文件单个压缩率
gzip -l 是唯一能直接输出压缩率的原生命令,但仅适用于单个 .gz 文件(不能是 tar.gz 归档本身):
- 输出列顺序固定:
compressed、uncompressed、ratio(以小数表示,如0.652)、uncompressed_name - 若要转为百分比:
gzip -l file.gz | awk 'NR==2 {printf "%.1f%%\n", $3*100}' - 对
.tar.gz文件直接运行会失败——它只认 gzip 压缩流,不识别 tar 封装;必须先用gunzip -c file.tar.gz | tar -t > /dev/null验证有效性,再单独查内部.gz成员(实际不可行,因为 tar.gz 是混合格式) - 不支持递归或目录批量扫描
手动计算 tar.gz / tar.bz2 的近似压缩率
对于 tar.gz 或 tar.bz2 这类归档+压缩组合,gzip -l 和 bzip2 -l 无法直接使用,只能靠间接估算:
- 先用
du -b archive.tar.gz得到压缩后体积 - 再用
tar -tf archive.tar.gz | xargs -r du -b 2>/dev/null | awk '{sum += $1} END {print sum+0}'粗略求和原始文件体积(注意:这会漏掉空目录、硬链接、特殊权限开销,结果偏小) - 压缩率 =
(1 - 压缩后体积 / 原始体积) * 100%,但原始体积越接近真实值,结果才越可靠 - 更准的做法是解压到 tmpfs 再
du -sb,但代价高、不实用;生产环境建议只在必要时做一次校验
zram 设备的压缩率不是“文件压缩率”
别把 /sys/block/zram*/orig_data_size 和 compr_data_size 当成文件压缩率——那是内核内存页压缩的运行时统计,和你磁盘上的 .zip 或 .gz 完全无关:
-
zram压缩的是匿名页(如 malloc 分配的内存),不是文件系统里的文件 -
grep compress /proc/meminfo只返回CompressedPages计数,无法换算成字节级压缩率 - 试图用
awk算出来的数字,反映的是当前 zram 设备的内存节省效果,不能用于评估任何具体文件的压缩效率
真正要对比不同压缩算法对同一组文件的效果,得用相同输入、分别用 gzip -9、bzip2 -9、zstd -19 打包,再各自用对应 -l 或 zipinfo -t 查——没有捷径,也没有跨格式统一接口。











