#!/bin/bash # 文件版本管理 SOP 腳本 # 用途: 安全處理文件更新時的舊版本歸檔 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}"))" && pwd) PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" ARCHIVE_DIR="$PROJECT_ROOT/archive" LOG_FILE="$PROJECT_ROOT/logs/file_migration.log" # 顏色定義 GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' RED='\033[0;31m' NC='\033[0m' # 確保必要目錄存在 setup_directories() { mkdir -p "$PROJECT_ROOT/logs" mkdir -p "$ARCHIVE_DIR" if [[ ! -f "$LOG_FILE" ]]; then echo "# 文件遷移日誌" > "$LOG_FILE" echo "# 格式: [日期時間] 操作類型 | 原文件 -> 目標位置 | 操作者 | 原因" >> "$LOG_FILE" echo "" >> "$LOG_FILE" fi } # 記錄遷移日誌 log_migration() { local operation="$1" local source_file="$2" local target_file="$3" local reason="$4" local operator="${5:-Claude Code}" local timestamp=$(date '+%Y-%m-%d %H:%M:%S') local log_entry="[$timestamp] $operation | $source_file -> $target_file | $operator | $reason" echo "$log_entry" >> "$LOG_FILE" echo -e "${GREEN}📋 記錄遷移: ${NC}$log_entry" } # 歸檔舊文件 archive_file() { local source_file="$1" local reason="$2" local operator="${3:-Claude Code}" if [[ ! -f "$source_file" ]]; then echo -e "${RED}❌ 文件不存在: $source_file${NC}" return 1 fi # 生成歸檔目錄 (按日期) local date_dir=$(date '+%Y-%m-%d') local archive_date_dir="$ARCHIVE_DIR/$date_dir" mkdir -p "$archive_date_dir" # 生成新文件名 (加上時間前綴) local filename=$(basename "$source_file") local timestamp=$(date '+%H%M%S') local archived_filename="${timestamp}_${filename}" local target_file="$archive_date_dir/$archived_filename" # 移動文件 mv "$source_file" "$target_file" if [[ $? -eq 0 ]]; then echo -e "${BLUE}📦 歸檔成功: ${NC}$source_file -> $target_file" log_migration "ARCHIVE" "$source_file" "$target_file" "$reason" "$operator" return 0 else echo -e "${RED}❌ 歸檔失敗: $source_file${NC}" return 1 fi } # 安全替換文件 (先歸檔舊版本) safe_replace() { local old_file="$1" local new_file="$2" local reason="$3" local operator="${4:-Claude Code}" if [[ ! -f "$new_file" ]]; then echo -e "${RED}❌ 新文件不存在: $new_file${NC}" return 1 fi if [[ -f "$old_file" ]]; then # 先歸檔舊文件 archive_file "$old_file" "$reason" "$operator" if [[ $? -ne 0 ]]; then echo -e "${RED}❌ 無法歸檔舊文件,中止替換${NC}" return 1 fi fi # 移動新文件到目標位置 mv "$new_file" "$old_file" if [[ $? -eq 0 ]]; then echo -e "${GREEN}✅ 安全替換完成: ${NC}$old_file" log_migration "REPLACE" "$new_file" "$old_file" "$reason" "$operator" return 0 else echo -e "${RED}❌ 替換失敗${NC}" return 1 fi } # 查看遷移日誌 view_log() { if [[ -f "$LOG_FILE" ]]; then echo -e "${BLUE}📋 文件遷移日誌:${NC}" cat "$LOG_FILE" else echo -e "${YELLOW}⚠️ 尚無遷移日誌${NC}" fi } # 列出歸檔文件 list_archives() { if [[ -d "$ARCHIVE_DIR" ]]; then echo -e "${BLUE}📦 歸檔文件列表:${NC}" find "$ARCHIVE_DIR" -type f -exec ls -la {} \; | sort else echo -e "${YELLOW}⚠️ 尚無歸檔文件${NC}" fi } # 主函數 main() { setup_directories case "$1" in "archive") if [[ $# -lt 3 ]]; then echo -e "${RED}使用方法: $0 archive 文件路徑 原因 [操作者]${NC}" exit 1 fi archive_file "$2" "$3" "$4" ;; "replace") if [[ $# -lt 4 ]]; then echo -e "${RED}使用方法: $0 replace 舊文件 新文件 原因 [操作者]${NC}" exit 1 fi safe_replace "$2" "$3" "$4" "$5" ;; "log") view_log ;; "list") list_archives ;; *) echo -e "${BLUE}🗃️ 文件版本管理工具${NC}" echo "用法:" echo " $0 archive 文件路徑 原因 [操作者] # 歸檔文件" echo " $0 replace 舊文件 新文件 原因 [操作者] # 安全替換文件" echo " $0 log # 查看遷移日誌" echo " $0 list # 列出歸檔文件" echo "" echo "範例:" echo " $0 archive TASK_MANAGEMENT_OLD.md \"系統重構\" \"Claude Code\"" echo " $0 replace old.md new.md \"功能更新\" \"開發者\"" ;; esac } main "$@"