#!/bin/bash # verify_backup.sh - 验证备份完整性 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CONFIG_FILE="${SCRIPT_DIR}/backup_config.json" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; } verify_backup_integrity() { local backup_file="$1" log "验证备份完整性: $backup_file" # 检查文件是否存在 if [[ ! -f "$backup_file" ]]; then echo "❌ 备份文件不存在" return 1 fi # 检查文件大小 local file_size=$(stat -c%s "$backup_file") if [[ $file_size -eq 0 ]]; then echo "❌ 备份文件为空" return 1 fi echo "✅ 文件大小: $(numfmt --to=iec-i --suffix=B $file_size)" # 检查tar归档完整性 if tar -tzf "$backup_file" > /dev/null 2>&1; then echo "✅ 归档完整性验证通过" # 统计文件数量 local file_count=$(tar -tzf "$backup_file" | wc -l) echo "✅ 包含文件数: $file_count" # 检查长路径文件 local long_path_files=$(tar -tzf "$backup_file" | grep -c '/.\{100,\}') if [[ $long_path_files -gt 0 ]]; then echo "📁 长路径文件数: $long_path_files" fi return 0 else echo "❌ 归档损坏或格式错误" return 1 fi } # 主函数 main() { local backup_file="${1:-}" if [[ -z "$backup_file" ]]; then # 使用最新备份 local backup_dir=$(jq -r '.storage.local_path // "/backups"' "$CONFIG_FILE") backup_file=$(find "$backup_dir" -name "backup_*.tar.gz" -o -name "backup_*.tar.gz.gpg" | sort | tail -1) if [[ -z "$backup_file" ]]; then echo "❌ 未找到备份文件" exit 1 fi fi echo "🔍 备份验证报告" echo "========================================" echo "备份文件: $backup_file" echo "验证时间: $(date)" echo "----------------------------------------" if verify_backup_integrity "$backup_file"; then echo "✅ 备份验证通过" exit 0 else echo "❌ 备份验证失败" exit 1 fi } main "$@"