火影忍者自动修改文件MD5值和size大小值的Linux脚本

本站资源仅用于学习交流,禁止商业运营与违法、侵权等非法行为;资源下载后请于 24 小时内删除,违规后果由使用者自行承担。

需求
1、需要查询md5和size的文件:

/www/wwwroot/game/pokemon/patch/3/res/version.plist
/www/wwwroot/game/pokemon/patch/194/res/version.plist
/www/wwwroot/game/pokemon/patch/194/src/app.defines.app_defines
/www/wwwroot/game/pokemon/patch/194/src/app.game_net

2、保存md5值和size大小值的json配置文件:

/mnt/pokemon/release/login/patch/cn/3.json
/mnt/pokemon/release/login/patch/cn/194.json

脚本

#!/bin/bash
 
# 脚本用于批量查询多个文件的MD5值和大小,并更新到对应的JSON配置文件中
# 根据路径自动判断应更新哪个JSON文件
 
# 定义需要查询的文件列表
FILES=(
    "/www/wwwroot/game/pokemon/patch/3/res/version.plist"
    "/www/wwwroot/game/pokemon/patch/194/res/version.plist"
    "/www/wwwroot/game/pokemon/patch/194/src/app.defines.app_defines"
    "/www/wwwroot/game/pokemon/patch/194/src/app.game_net"
)
 
# 检查所有文件是否存在
missing_files=()
for file_path in "${FILES[@]}"; do
    if [ ! -f "$file_path" ]; then
        missing_files+=("$file_path")
    fi
done
 
if [ ${#missing_files[@]} -gt 0 ]; then
    echo "错误: 以下文件不存在:"
    for file in "${missing_files[@]}"; do
        echo "  - $file"
    done
    exit 1
fi
 
# 函数:根据文件路径获取对应的JSON文件
get_json_file() {
    local file_path=$1
    if [[ "$file_path" =~ /patch/194/ ]]; then
        echo "/mnt/pokemon/release/login/patch/cn/194.json"
    else
        # 默认为3.json,可以根据需要扩展更多路径规则
        echo "/mnt/pokemon/release/login/patch/cn/3.json"
    fi
}
 
# 函数:获取文件的相对路径名(用于JSON中的name字段)
get_relative_name() {
    local file_path=$1
    # 移除基础路径,保留相对路径
    # 根据实际JSON格式,我们只需要从patch开始的部分
    if [[ "$file_path" =~ /patch/([0-9]+)/ ]]; then
        patch_num="${BASH_REMATCH[1]}"
        # 提取从patch目录开始的相对路径
        relative_path=${file_path#*/patch/$patch_num/}
        echo "$relative_path"
    else
        # 如果路径不匹配预期格式,使用原始方法
        local relative_path=${file_path#/www/wwwroot/game/pokemon/}
        echo "$relative_path"
    fi
}
 
# 创建关联数组来存储每个JSON文件需要更新的文件信息
declare -A json_updates
declare -A json_backup_done
 
# 遍历所有文件并分类
for file_path in "${FILES[@]}"; do
    # 计算MD5值和文件大小
    md5_value=$(md5sum "$file_path" | awk '{print $1}')
    file_size=$(stat -c %s "$file_path")
     
    # 获取相对路径名
    relative_name=$(get_relative_name "$file_path")
     
    # 获取对应的JSON文件
    json_file=$(get_json_file "$file_path")
     
    echo "文件: $relative_name"
    echo "  路径: $file_path"
    echo "  MD5值: $md5_value"
    echo "  大小: $file_size 字节"
    echo "  对应JSON: $json_file"
    echo "---"
     
    # 检查JSON文件是否存在
    if [ ! -f "$json_file" ]; then
        echo "错误: JSON文件 $json_file 不存在!"
        exit 1
    fi
     
    # 备份JSON文件(仅备份一次)
    if [ -z "${json_backup_done[$json_file]}" ]; then
        cp "$json_file" "${json_file}.backup"
        json_backup_done[$json_file]=1
        echo "已备份 $json_file 到 ${json_file}.backup"
    fi
     
    # 存储更新信息
    json_updates["$json_file|$relative_name|md5"]=$md5_value
    json_updates["$json_file|$relative_name|size"]=$file_size
done
 
# 函数:使用更精确的方法更新JSON文件
update_with_precise_method() {
    local json_file="$1"
     
    # 为每个需要更新的文件执行更新
    for key in "${!json_updates[@]}"; do
        if [[ "$key" == "$json_file|"* ]]; then
            parts=(${key//|/ })
            if [ "${parts[0]}" = "$json_file" ] && [ "${parts[2]}" = "md5" ]; then
                relative_name="${parts[1]}"
                md5_val="${json_updates[$key]}"
                size_val="${json_updates[${json_file}|${relative_name}|size]}"
                 
                echo "  更新文件: $relative_name"
                echo "    - MD5: $md5_val"
                echo "    - Size: $size_val"
                 
                # 使用一个更精确的方法:逐行处理JSON
                temp_file=$(mktemp)
                 
                # 创建awk脚本来处理JSON更新
                awk -v target_name="$relative_name" -v new_size="$size_val" -v new_md5="$md5_val" '
                BEGIN {
                    in_target_object = 0
                    found_name = 0
                }
                 
                {
                    line = $0
                    modified_line = line
                     
                    # 检查是否是包含目标name的行
                    if (index(line, ""name":") > 0 && index(line, """ target_name """) > 0) {
                        found_name = 1
                        in_target_object = 1
                    }
                     
                    # 如果在目标对象中,更新size和md5
                    if (in_target_object && index(line, ""size":") > 0) {
                        gsub(/"size":[[:space:]]*[0-9]+/, ""size": " new_size, modified_line)
                    }
                     
                    if (in_target_object && index(line, ""md5":") > 0) {
                        gsub(/"md5":[[:space:]]*"[^"]*"/, ""md5": "" new_md5 """, modified_line)
                    }
                     
                    # 如果遇到 } 并且之前找到了name,那么退出目标对象
                    if (in_target_object && index(line, "}") > 0) {
                        in_target_object = 0
                        found_name = 0
                    }
                     
                    print modified_line
                }' "$json_file" > "$temp_file"
                 
                # 替换原文件
                mv "$temp_file" "$json_file"
            fi
        fi
    done
}
 
# 处理每个JSON文件的更新
for json_file in "${!json_backup_done[@]}"; do
    echo "更新 $json_file"
    update_with_precise_method "$json_file"
done
 
# 验证修改后的内容
for json_file in "${!json_backup_done[@]}"; do
    echo "验证 $json_file 中的相关条目:"
    for key in "${!json_updates[@]}"; do
        if [[ "$key" == "$json_file|"* ]]; then
            parts=(${key//|/ })
            if [ "${parts[0]}" = "$json_file" ] && [ "${parts[2]}" = "md5" ]; then
                relative_name="${parts[1]}"
                expected_md5="${json_updates[$key]}"
                expected_size="${json_updates[${json_file}|${relative_name}|size]}"
                 
                echo "  文件: $relative_name"
                 
                # 在更新后的文件中查找该条目
                if grep -q ""name": *"$relative_name"" "$json_file"; then
                    # 显示包含该文件名的对象
                    result=$(grep -A 5 -B 0 ""name": *"$relative_name"" "$json_file" | head -7)
                    echo "$result"
                     
                    # 检查是否成功更新了MD5和Size
                    if echo "$result" | grep -q ""md5": *"$expected_md5""; then
                        echo "    ✓ MD5值已成功更新"
                    else
                        echo "    ✗ MD5值未更新,期望: $expected_md5"
                    fi
                     
                    if echo "$result" | grep -q ""size": *$expected_size"; then
                        echo "    ✓ Size值已成功更新"
                    else
                        echo "    ✗ Size值未更新,期望: $expected_size"
                    fi
                else
                    echo "    (未找到此条目)"
                fi
            fi
        fi
    done
    echo "---"
done
 
echo "所有文件信息更新完成!"
© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容