#!/bin/bash # 定义文件替换对(数组形式,格式:源文件 目标文件) # 可按需添加/删除行,每行一组 源文件 目标文件 FILE_PAIRS=( "/usr/src/paperless/scripts/parsers.py" "/usr/src/paperless/src/paperless_tesseract/parsers.py" # 示例:新增更多文件对 #"/usr/src/paperless/git_scripts/parse_filename.py" "/usr/src/paperless/scripts/parse_filename.py" # "/path/to/source/file3" "/path/to/dest/file3" # "/path/to/source/file4" "/path/to/dest/file4" ) # 检查所有文件是否存在(仅检查replace/check操作需要的文件) check_files_exist() { local missing=0 local pair_count=${#FILE_PAIRS[@]} # 遍历文件对(步长2:源文件、目标文件为一组) for ((i=0; i $source 的差异 ---" diff -u "$dest" "$source" || true # 无差异时不报错 done } # 备份单个文件(添加 .bak 后缀,保留原权限) backup_file() { local file="$1" local backup="$file.bak" if [ -f "$backup" ]; then echo "提示:旧备份文件已存在,将覆盖 - $backup" rm -f "$backup" fi cp -a "$file" "$backup" # -a 保留权限、属性、时间戳等 echo "已备份:$file -> $backup" } # 替换所有文件对 replace_files() { local pair_count=${#FILE_PAIRS[@]} echo "=== 开始替换文件(先备份目标文件) ===" for ((i=0; i $dest ---" backup_file "$dest" cp -f "$source" "$dest" echo "已替换:$source 覆盖 $dest" done echo -e "\n=== 替换完成,验证最终差异(应无差异) ===" show_diffs } # 回滚替换操作(恢复 .bak 备份文件) rollback_files() { local pair_count=${#FILE_PAIRS[@]} echo "=== 开始回滚替换操作 ===" for ((i=0; i $dest ---" if [ -f "$backup" ]; then # 先备份当前文件(防止回滚出错) cp -a "$dest" "$dest.rollback_temp" 2>/dev/null || true # 恢复备份文件 mv -f "$backup" "$dest" echo "已回滚:$dest 恢复为备份版本" # 删除临时文件 rm -f "$dest.rollback_temp" 2>/dev/null || true else echo "跳过:备份文件不存在 - $backup" fi done echo -e "\n=== 回滚操作执行完成 ===" } # 主逻辑 main() { case "$1" in check) echo "=== 执行文件差异检查(不修改文件) ===" check_files_exist "check" show_diffs ;; replace) echo "=== 执行文件替换操作(自动备份) ===" check_files_exist "replace" replace_files ;; rollback) echo "=== 执行文件回滚操作(恢复备份) ===" check_files_exist "rollback" rollback_files ;; *) echo "用法:$0 [check|replace|rollback]" echo " check - 仅检查所有文件对的差异,不做修改" echo " replace - 备份所有目标文件并执行替换,完成后验证差异" echo " rollback - 回滚替换操作(恢复 .bak 备份文件)" exit 1 ;; esac } # 启动主逻辑 main "$1"