1 2 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
|