#!/bin/bash # 路径适配脚本:修正所有硬编码路径 + conda环境修复 + 端口适配 # 在数据同步完成后执行 set -u BASE="/home/xsl/change_hair" PROJ="$BASE/project" LOG="$PROJ/logs/adapt.log" mkdir -p "$PROJ/logs" echo "路径适配开始: $(date '+%Y-%m-%d %H:%M:%S')" | tee "$LOG" # ============================================================ # 第一部分:conda 环境硬编码路径修复 # ============================================================ echo "=== [1/4] 修复 conda 环境 shebang/路径前缀 ===" | tee -a "$LOG" for ENV in py310 my_hair sdwebui; do ENVDIR="/home/xsl/miniconda3/envs/$ENV" if [ -d "$ENVDIR" ]; then # 替换所有文本文件里的旧前缀为新前缀 # 旧前缀有两种:/home/szlc/miniconda3 和 /usr/local/miniconda3 grep -rl '/home/szlc/miniconda3\|/usr/local/miniconda3' "$ENVDIR" 2>/dev/null | while read -r f; do sed -i 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g; s|/usr/local/miniconda3|/home/xsl/miniconda3|g' "$f" done echo " [$ENV] 修复完成" | tee -a "$LOG" else echo " [$ENV] 目录不存在,跳过" | tee -a "$LOG" fi done # ============================================================ # 第二部分:hair_service_sd 配置和代码路径适配 # ============================================================ echo "=== [2/4] 适配 hair_service_sd 路径 ===" | tee -a "$LOG" HS="$PROJ/hair_service_sd" # 安全替换函数:只处理 .py / .ini / .conf 文件,跳过权重/图片/二进制 adapt_hair_paths() { local f="$1" [ -f "$f" ] || return 0 case "$f" in *.py|*.ini|*.conf|*.sh|*.json|*.yaml|*.yml|*.txt) ;; *) return 0 ;; esac sed -i \ -e 's|/home/szlc/project|/home/xsl/change_hair/project|g' \ -e 's|/data/train_material|/home/xsl/change_hair/data/train_material|g' \ -e 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g' \ -e 's|/usr/local/miniconda3|/home/xsl/miniconda3|g' \ "$f" } # 处理 hair_service_sd 顶层文件和 common/config 子目录 for f in "$HS"/*.py "$HS"/*.ini "$HS"/*.sh "$HS"/*.conf "$HS"/common/*.py "$HS"/config/*.ini "$HS"/config/*.py "$HS"/core/*.py "$HS"/utils/*.py; do adapt_hair_paths "$f" done echo " hair_service_sd 配置/代码路径已适配" | tee -a "$LOG" # ============================================================ # 第三部分:photo_service 路径适配 # 注意:photo_service 的 chinatszrn/kohya 路径属于 Docker 训练链路, # 本机不配 Docker,这些路径保留不动(不影响换发色/换发型) # 但基础路径和 callback_url 要适配 # ============================================================ echo "=== [3/4] 适配 photo_service 路径 ===" | tee -a "$LOG" PS="$PROJ/photo_service" for f in "$PS"/*.py; do [ -f "$f" ] || continue sed -i \ -e 's|/home/szlc/project|/home/xsl/change_hair/project|g' \ -e 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g' \ "$f" done echo " photo_service 基础路径已适配(kohya/Docker路径保留)" | tee -a "$LOG" # ============================================================ # 第四部分:onediff webui 路径适配 # ============================================================ echo "=== [4/4] 适配 onediff webui 路径 ===" | tee -a "$LOG" OD="$PROJ/onediff/stable-diffusion-webui" # webui config.json 里的 onediff compiler_caches 路径 if [ -f "$OD/config.json" ]; then sed -i 's|/home/student/Documents/workspace_cxt_tianjing_hair/onediff|/home/xsl/change_hair/project/onediff|g; s|/home/szlc/project/onediff|/home/xsl/change_hair/project/onediff|g' "$OD/config.json" echo " webui config.json 已适配" | tee -a "$LOG" fi # webui 启动脚本 for f in "$OD"/webui.sh "$OD"/webui-user.sh "$PROJ"/onediff/onediff/*.sh; do [ -f "$f" ] && sed -i 's|/home/szlc/miniconda3|/home/xsl/miniconda3|g' "$f" done # ============================================================ # 第五部分:Lora 软链接(photo_service 训练产物输出位置) # 本机用真实目录,不走 /gz-fs 软链 # ============================================================ echo "=== [5/5] 配置 Lora 目录 ===" | tee -a "$LOG" mkdir -p "$BASE/gz-fs/Lora" # webui 的 models/Lora 已随 onediff 拷贝过来(真实目录),无需软链 echo " Lora 目录就绪: $BASE/gz-fs/Lora" | tee -a "$LOG" echo "路径适配完成: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a "$LOG" echo "请检查 $LOG 确认无误" | tee -a "$LOG"