校验 zip 包完整性需比对源目录文件数与 zip 内文件数,推荐用 unzip -z1 或 zipinfo -1 | grep -v '/$' 统计,配合 find -type f 获取源文件数,确保口径一致。

在自动化备份脚本中,校验 ZIP 包是否完整,关键之一是确认压缩包内文件数量与原始目录一致。直接读取 ZIP 文件的文件总数,不需解压,可用标准命令行工具高效完成。
用 zipinfo 提取文件计数(推荐)
zipinfo 是 Info-ZIP 工具集自带命令,轻量、可靠、跨平台(Linux/macOS/Windows WSL 均支持)。它能列出 ZIP 内容结构而不解压:
- 统计所有普通文件(不含目录项):
zipinfo -t archive.zip | grep "files$" | awk '{print $1}' - 更稳妥的方式(过滤掉目录条目,只计文件):
zipinfo -1 archive.zip | grep -v '/$' | wc -l
(-1输出一行一个路径,grep -v '/$'排除以/结尾的目录项)
用 unzip -Z1 获取精简列表(Linux/macOS)
unzip -Z1 是 unzip 的“zipinfo 模式”,输出格式紧凑,适合脚本解析:
- 仅输出文件名(不含目录),每行一个:
unzip -Z1 archive.zip | wc -l - 若需排除空目录或符号链接(极少见),可加
grep -v '/$'进一步过滤
校验逻辑建议:结合数量 + 可选大小/时间戳
纯数量校验快但不够强,建议组合使用:
- 备份前:用
find /path -type f | wc -l统计源文件数(注意排除临时文件、隐藏文件等,保持口径一致) - 备份后:用上述任一方法获取 ZIP 内文件数,比对是否相等
- 进阶校验(可选):
• 总大小比对:unzip -Zs archive.zip | awk '{sum += $1} END {print sum}'
• 随机抽样校验 MD5(对关键小文件)
Shell 脚本片段示例
一段简洁可靠的校验逻辑:
src_count=$(find "$SOURCE_DIR" -type f | wc -l | xargs) zip_count=$(unzip -Z1 "$ZIP_FILE" 2>/dev/null | wc -l | xargs) if [ "$src_count" -eq "$zip_count" ]; then echo "✅ 文件数量匹配:$src_count 个" else echo "❌ 数量不一致:源 $src_count ≠ ZIP $zip_count" exit 1 fi











