zipcmp 是 libzip 工具集的一部分,专门用于比较两个ZIP归档文件的内容差异。它并不需要解压文件,而是直接读取ZIP文件的内部结构进行比较。
zipcmp 通常包含在 libzip-tools 或 libzip 包中:
sudo apt update
sudo apt install libzip-tools
或者安装完整包:
sudo apt install libzip-dev libzip-tools
sudo yum install libzip libzip-tools
或从EPEL源安装:
sudo yum install epel-release
sudo yum install libzip libzip-tools
which zipcmp 或 zipcmp --version 2>/dev/null || echo "未安装"
zipcmp [选项] zip文件1 zip文件2
zip文件1:第一个要比较的ZIP文件zip文件2:第二个要比较的ZIP文件选项:控制比较行为的各种参数| 参数 | 说明 |
|---|---|
-h 或 --help |
显示帮助信息 |
-V 或 --version |
显示版本信息 |
-v 或 --verbose |
详细输出模式,显示更多信息 |
-q 或 --quiet |
安静模式,只显示关键差异 |
-s 或 --size |
比较文件大小 |
-c 或 --crc |
比较CRC校验和 |
-t 或 --time |
比较文件修改时间 |
-i 或 --ignore-case |
忽略文件名大小写差异 |
-n 或 --name-only |
只比较文件名,忽略其他属性 |
-r 或 --recurse |
递归比较目录结构 |
-d 或 --diff |
以diff格式输出差异 |
--exclude=模式 |
排除匹配模式的文件 |
--include=模式 |
只比较匹配模式的文件 |
zipcmp --help查看您系统上的具体参数。
zipcmp执行后会返回以下退出码:
| 返回码 | 说明 |
|---|---|
0 |
两个ZIP文件完全相同 |
1 |
两个ZIP文件存在差异 |
2 |
出现错误(如文件不存在、权限问题等) |
在脚本中可以通过$?获取返回码来判断比较结果。
比较两个ZIP文件:
zipcmp archive1.zip archive2.zip
如果两个文件相同,没有任何输出(返回码0)。如果有差异,会显示类似:
archive1.zip: file1.txt (size differs)
archive2.zip: extra.txt (only in archive2.zip)
zipcmp -v archive1.zip archive2.zip
详细输出示例:
Comparing archive1.zip and archive2.zip...
Files in both archives:
common.txt (size: 1024, crc: 0x12345678, time: 2023-10-01 10:30:00)
Files only in archive1.zip:
file1.txt (size: 2048, crc: 0x87654321, time: 2023-10-01 11:00:00)
Files only in archive2.zip:
file2.txt (size: 4096, crc: 0xabcdef12, time: 2023-10-01 12:00:00)
Files with differences:
config.ini (size differs: 512 vs 1024)
只比较文件大小:
zipcmp -s archive1.zip archive2.zip
比较CRC校验和:
zipcmp -c archive1.zip archive2.zip
比较文件修改时间:
zipcmp -t archive1.zip archive2.zip
组合多个参数:
zipcmp -s -c -t archive1.zip archive2.zip
只比较.txt文件:
zipcmp --include="*.txt" archive1.zip archive2.zip
排除.log文件:
zipcmp --exclude="*.log" archive1.zip archive2.zip
忽略文件名大小写:
zipcmp -i archive1.zip archive2.zip
只比较文件名:
zipcmp -n archive1.zip archive2.zip
检查两个ZIP文件是否相同:
#!/bin/bash
FILE1="backup_20231001.zip"
FILE2="backup_20231002.zip"
if zipcmp -q "$FILE1" "$FILE2" >/dev/null 2>&1; then
echo "两个备份文件相同"
else
echo "备份文件有差异"
# 显示具体差异
zipcmp -v "$FILE1" "$FILE2"
fi
批量比较多个ZIP文件对:
#!/bin/bash
# 比较目录下所有成对的ZIP文件
for file1 in /path/to/zips/*.zip; do
for file2 in /path/to/zips/*.zip; do
if [[ "$file1" < "$file2" ]]; then
echo "比较: $(basename "$file1") 和 $(basename "$file2")"
zipcmp -q "$file1" "$file2"
if [[ $? -eq 0 ]]; then
echo " -> 这两个文件相同"
fi
fi
done
done
以diff格式输出差异:
zipcmp -d archive1.zip archive2.zip
递归比较(适用于包含目录的ZIP文件):
zipcmp -r archive1.zip archive2.zip
将结果重定向到文件:
zipcmp -v archive1.zip archive2.zip > comparison_result.txt
结合find命令比较目录下所有ZIP文件:
find /path/to/dir -name "*.zip" -exec zipcmp -q {} reference.zip \; -print
-q参数避免不必要的输出-n只比较文件名,快速筛选--include限制比较范围-c参数验证文件内容是否一致-s和-t进行全面检查在CI/CD流水线中验证构建产物:
#!/bin/bash
# 构建前后比较
OLD_BUILD="build_old.zip"
NEW_BUILD="build_new.zip"
echo "比较构建产物..."
if zipcmp -q "$OLD_BUILD" "$NEW_BUILD"; then
echo "✓ 构建产物无变化"
else
echo "✗ 构建产物有差异"
echo "差异详情:"
zipcmp -v "$OLD_BUILD" "$NEW_BUILD" | head -20
exit 1
fi
验证备份文件的完整性:
#!/bin/bash
SOURCE_DIR="/data/important"
BACKUP_FILE="/backup/important_$(date +%Y%m%d).zip"
REFERENCE_FILE="/backup/important_reference.zip"
# 创建备份
zip -r "$BACKUP_FILE" "$SOURCE_DIR"
# 与参考备份比较
if zipcmp -c -s "$BACKUP_FILE" "$REFERENCE_FILE"; then
echo "备份验证成功"
else
echo "警告:备份与参考文件不一致"
echo "差异:"
zipcmp -v "$BACKUP_FILE" "$REFERENCE_FILE"
fi
cmp - 逐字节比较两个文件diff - 比较文本文件的差异comm - 比较两个排序文件的行md5sum - 计算并检查MD5校验和sha256sum - 计算并检查SHA256校验和zip - 创建ZIP压缩包unzip - 解压ZIP文件zipinfo - 查看ZIP文件信息zipgrep - 在ZIP文件中搜索内容zipsplit - 分割ZIP文件如果zipcmp不可用,可以使用其他方法比较ZIP文件:
# 方法1:使用unzip和diff比较文件列表
diff <(unzip -l archive1.zip | awk '{print $4}' | sort) \
<(unzip -l archive2.zip | awk '{print $4}' | sort)
# 方法2:比较文件大小和CRC
diff <(unzip -v archive1.zip | grep -v "Archive:" | sort) \
<(unzip -v archive2.zip | grep -v "Archive:" | sort)
# 方法3:使用Python脚本
python3 -c "
import zipfile, sys
z1 = zipfile.ZipFile(sys.argv[1])
z2 = zipfile.ZipFile(sys.argv[2])
print('差异:', set(z1.namelist()) ^ set(z2.namelist()))
" archive1.zip archive2.zip