| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 
 | #!/bin/bash
 
 # ====== 配置路径 ======
 source_folder="$HOME/Library/Obsidian/1-blog"
 destination_folder="$HOME/blog/source/_posts"
 image_folder="$HOME/Library/blog/source/images"
 hexo_root="$HOME/Library/blog"
 log_file="$hexo_root/deploy.log"
 
 # ====== 参数处理 ======
 PREVIEW=false
 BACKUP=false
 for arg in "$@"; do
 case $arg in
 --preview) PREVIEW=true ;;
 --backup) BACKUP=true ;;
 esac
 done
 
 # ====== 日志函数 ======
 log() {
 echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$log_file"
 }
 
 # ====== 检查 SSH 连接 ======
 log "🔐 检查 GitHub SSH 连接..."
 if ! ssh -T [email protected] 2>&1 | grep -q "successfully authenticated"; then
 log "❌ SSH 未配置或连接失败!请先配置 GitHub SSH key:https://github.com/settings/keys"
 exit 1
 fi
 log "✅ SSH 连接正常"
 
 # ====== 可选备份 ======
 if $BACKUP; then
 backup_zip="$HOME/Desktop/1-blog-backup_$(date +'%Y%m%d-%H%M%S').zip"
 log "🗃️ 正在备份 Obsidian 博客目录..."
 zip -r "$backup_zip" "$source_folder" >/dev/null
 log "✅ 已备份到桌面:$backup_zip"
 fi
 
 # ====== 确保目录存在 ======
 mkdir -p "$destination_folder"
 mkdir -p "$image_folder"
 
 # ====== 增量同步 Markdown 和图片文件 ======
 log "📥 增量同步 Markdown 和图片..."
 rsync -av --include="*/" \
 --include="*.md" \
 --include="*.png" \
 --include="*.jpg" \
 --include="*.jpeg" \
 --include="*.gif" \
 --include="*.svg" \
 --include="*.webp" \
 --exclude="*" \
 "$source_folder"/ "$destination_folder"/
 
 # ====== 替换图片语法 & 拷贝图片 ======
 log "🛠 替换 Obsidian 图片语法,并复制图片..."
 
 find "$destination_folder" -name "*.md" | while read -r mdfile; do
 rel_md_path="${mdfile#$destination_folder/}"
 original_md="$source_folder/$rel_md_path"
 original_md_dir=$(dirname "$original_md")
 
 # 查找 Obsidian 图片语法
 perl -nle 'print $1 while /\!\[\[\s*(.*?)\s*\]\]/g' "$mdfile" | while read -r relimg; do
 imgname=$(basename "$relimg")
 src_img="$original_md_dir/$relimg"
 dest_img="$image_folder/$imgname"
 
 if [[ -f "$src_img" ]]; then
 # 增量复制
 if [[ ! -f "$dest_img" ]]; then
 cp "$src_img" "$dest_img"
 log "🖼 已复制图片: $src_img -> $dest_img"
 fi
 else
 log "⚠️ 图片未找到: $src_img"
 fi
 done
 
 # 替换 Obsidian 语法为 Hexo 路径
 perl -i -pe 's/\!\[\[\s*(.*?)\s*\]\]/![]\(\/images\/\1\)/g' "$mdfile"
 perl -i -pe 's/\/images\/.*\/([^\/]+\.(png|jpg|jpeg|gif|svg|webp))/\/images\/$1/g' "$mdfile"
 done
 
 log "✅ 图片路径修复完成"
 
 # ====== Hexo 构建或预览 ======
 cd "$hexo_root" || { log "❌ Hexo 根目录不存在"; exit 1; }
 
 log "🧹 Hexo 清理 & 生成中..."
 hexo clean && hexo generate
 
 if $PREVIEW; then
 log "🌐 启动本地预览..."
 hexo server &
 sleep 2
 open "http://localhost:4000"
 log "✅ 浏览器已打开本地预览"
 else
 log "🚀 正在部署 Hexo 博客..."
 hexo deploy && log "✅ 部署完成"
 fi
 
 
 
 |