在Linux系统中,压缩比是衡量压缩效果的重要指标,通常指原始数据大小与压缩后数据大小的比值(或压缩后大小占原始大小的百分比),不同压缩工具的压缩比输出方式和计算逻辑略有差异,以下将详细介绍常见压缩工具如何输出压缩比,并结合示例说明。

压缩比的基本概念
压缩比的计算公式为:
压缩比 = 原始数据大小 / 压缩后数据大小
或
压缩率 = (压缩后数据大小 / 原始数据大小) × 100%
压缩比越大(或压缩率越小),说明压缩效果越好,一个10MB的文件压缩后变为2MB,压缩比为5:1,压缩率为20%。
常见压缩工具的压缩比输出方法
gzip/gunzip
gzip是Linux中最常用的压缩工具之一,基于DEFLATE算法,默认压缩级别为6(最高为9),使用gzip -v(verbose模式)压缩文件时,会直接输出压缩率和压缩前后的大小信息。
示例:
gzip -v test.txt
输出:
test.txt: 40.0% -- replaced with test.txt.gz
40.0%”表示压缩后大小为原始大小的40%,压缩比为1/0.4=2.5:1,若需查看压缩后文件的具体大小,可结合ls -lh:
ls -lh test.txt.gz
bzip2/bunzip2
bzip2采用BWT算法,压缩率通常高于gzip,但速度较慢,使用bzip2 -v压缩时,会输出压缩比和压缩后大小。
示例:
bzip2 -v test.txt
输出:
test.txt: 1.234:1, 4.567 bits/byte, done
“1.234:1”表示压缩比为1.234:1(即原始数据1.234字节压缩为1字节),压缩率约为81%(1/1.234×100%)。

xz/unxz
xz使用LZMA2算法,压缩率最高但速度最慢,适合对压缩率要求极高的场景。xz -v会输出详细的压缩统计信息,包括压缩比、压缩后大小等。
示例:
xz -v test.txt
输出:
test.txt (1:1): 2.500:1, 3.200 bits/byte, uncompressed, CRC32, 64-bit, little endian
“2.500:1”直接给出压缩比,即原始数据2.5字节压缩为1字节,压缩率为40%。
zip/unzip
zip主要用于压缩目录,支持多种算法,压缩时不会直接显示压缩比,需通过对比压缩前后大小计算。
示例:
zip -r archive.zip directory/
压缩后分别查看原始目录和压缩包大小:
du -sh directory/ # 原始大小 ls -lh archive.zip # 压缩后大小
手动计算压缩比:若原始目录为10MB,压缩包为3MB,压缩比约为3.33:1。
tar结合压缩工具
tar本身不压缩,但可结合gzip(-z)、bzip2(-j)、xz(-J)等选项实现压缩,压缩后需通过对比原始目录和压缩包大小计算压缩比。

示例:
tar -czvf archive.tar.gz directory/ # 用gzip压缩
计算压缩比:
du -sh directory/ # 原始大小 ls -lh archive.tar.gz # 压缩后大小
不同压缩工具压缩比对比(示例)
假设原始文件大小为100MB,以下为不同工具的典型压缩效果:
| 工具 | 压缩级别 | 压缩后大小 | 压缩比 | 压缩率 |
|---|---|---|---|---|
| gzip | -6 | 40MB | 5:1 | 40% |
| bzip2 | -9 | 30MB | 33:1 | 30% |
| xz | -9 | 20MB | 5:1 | 20% |
通用压缩比计算方法
若工具未直接输出压缩比,可通过以下步骤计算:
- 获取原始文件/目录大小:
du -sb <文件/目录>(显示字节)或du -sh <文件/目录>(显示易读格式)。 - 压缩文件后获取压缩后大小:
ls -lh <压缩文件>或du -sb <压缩文件>。 - 计算压缩比:
原始大小 / 压缩后大小。
相关问答FAQs
Q1: 为什么不同压缩工具的压缩比差异较大?
A1: 压缩比主要受算法、压缩级别和文件类型影响。
- 算法差异:xz的LZMA2算法压缩率高于gzip的DEFLATE,但速度更慢;
- 压缩级别:gzip的-9级压缩率高于-1级,但耗时更长;
- 文件类型:文本文件(如.log、.txt)压缩率高,而已压缩文件(如.jpg、.mp3)压缩率低,甚至可能因添加元数据而增大。
Q2: 如何批量计算多个文件的压缩比?
A2: 可通过Shell脚本遍历文件,结合gzip和du计算压缩比。
#!/bin/bash
for file in *; do
if [ -f "$file" ]; then
original_size=$(du -b "$file" | cut -f1)
gzip -k "$file"
compressed_size=$(du -b "${file}.gz" | cut -f1)
ratio=$(echo "scale=2; $original_size / $compressed_size" | bc)
echo "文件: $file, 压缩比: $ratio:1"
rm "${file}.gz"
fi
done
运行脚本后,会输出当前目录下每个文件的压缩比(-k选项保留原文件,计算后删除临时压缩包)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/38003.html