前言
之前在 Windows 電腦上使用 Dropbox , 手機使用 Dropsync 來同步 Obsidian 筆記, 但 Arch Linux 上沒有官方的 Dropbox client, 後來查到 RCLONE 支援不少雲端硬碟服務, 就算以後 Dropbox 收攤, 也可以無痛轉移, 乾脆就測試看看, 因為要先授權 RCLONE 對接 Dropbox, 擔心動到其他資料, 所以我是另建一個 Dropbox 帳號, 再分享主帳號的 Obsidian 資料夾給分身帳號
bisync 根據官方文件目前還在 beta 版, 使用的時候謹慎為上
首先使用 –resync –resync-mode “newer” –dry-run 測試, 檢查 log 有沒有問題, 接著拿掉 –dry-run, 最後拿掉 –resync 與 –resync-mode “newer”
1
| rclone bisync ~/Documents/Dropbox_Obsidian/Obsidian/ dropbox_obsidian:DropSync/Obsidian -MvP --check-access --check-filename TODO.md --resync --resync-mode "newer" --dry-run
|
-M 保存 metadata
-P 顯示目前進度 Progress
-v 詳細輸出說明
-check-access 確保兩個資料夾下都有某個相同檔案, 以免設定錯誤
指令存成 Script
測試指令沒問題後, 請 Claude 和 ChatGPT 加上判斷邏輯和說明及 log, 搭配 git 做紀錄來避免某天砍錯檔案, 再把指令儲存成 script, 存成 ~/Documents/Dropbox_Obsidian/improved-rclone-bisync-git-script.sh
, 內容如下
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
| #!/bin/bash
# === 配置變數 === BACKUP_DIR="$HOME/Documents/Dropbox_Obsidian/Obsidian/" GIT_REPO="$HOME/Documents/Dropbox_Obsidian" RCLONE_REMOTE="dropbox_obsidian" RCLONE_PATH="DropSync/Obsidian" LOG_FILE="$HOME/Documents/Dropbox_Obsidian/backup-sync.log" LOCK_FILE="/tmp/backup-sync.lock" CONFLICT_DIR="$HOME/Documents/Dropbox_Obsidian/.conflicts" MAX_CONFLICT_AGE=30 # 天
# === 日誌函數 === log_message() { local level="${2:-INFO}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $1" | tee -a "$LOG_FILE" }
# === 清理函數 === cleanup() { rm -f "$LOCK_FILE" log_message "清理完成" "INFO" }
# === Git 提交變更 === git_commit_changes() { cd "$GIT_REPO" || { log_message "無法進入 Git 倉庫" "ERROR"; exit 1; } # 暫存所有變更 git add -A # 檢查是否有變更需要提交 if ! git diff --cached --quiet; then git commit -m "本地備份 - $(date '+%Y-%m-%d %H:%M:%S')" || { log_message "Git 提交失敗" "ERROR" exit 1 } log_message "已提交本地變更" "INFO" else log_message "沒有需要提交的變更" "INFO" fi }
# === 處理同步衝突 === handle_sync_conflict() { local conflict_file="$1" local conflict_backup="$CONFLICT_DIR/$(basename "$conflict_file")_$(date '+%Y%m%d_%H%M%S')" mkdir -p "$CONFLICT_DIR" mv "$conflict_file" "$conflict_backup" log_message "已處理衝突檔案:$conflict_backup" "WARN" }
# === 主邏輯 === main() { # 確保單例執行 exec 200>"$LOCK_FILE" || exit 1 flock -n 200 || { log_message "程序已在執行中" "ERROR"; exit 1; } trap cleanup EXIT
# 1. 提交本地 Git 變更 git_commit_changes
# 2. Rclone Bisync 同步 log_message "----" log_message "開始 Rclone Bisync 同步" "INFO" rclone bisync "$BACKUP_DIR" "$RCLONE_REMOTE:$RCLONE_PATH" \ -M \ --conflict-resolve "newer" \ --track-renames \ --check-access \ --check-filename TODO.md \ --verbose \ --recover \ --log-file "$LOG_FILE" || { log_message "Rclone Bisync 同步失敗" "ERROR" exit 1 }
# 3. 處理 Rclone 衝突檔案 conflict_files=$(find "$BACKUP_DIR" -type f -name "*_RCLONE_CONFLICT*") if [[ -n "$conflict_files" ]]; then # 處理衝突檔案 find "$BACKUP_DIR" -type f -name "*_RCLONE_CONFLICT*" -print0 | while IFS= read -r -d '' conflict_file; do handle_sync_conflict "$conflict_file" done else log_message "未發現衝突檔案,跳過處理" "INFO" fi
# 4. 再次提交因 Rclone 引發的本地變更 git_commit_changes
# 5. 清理舊的衝突檔案 find "$CONFLICT_DIR" -type f -mtime +"$MAX_CONFLICT_AGE" -delete log_message "清理過期衝突檔案完成" "INFO"
log_message "備份與同步流程完成" "INFO" }
# === 執行主函數 === main
|
KDE Autostart
接著在 ~/.config/autostart
下面新增一個 obsidian_sync.desktop , 內容如下
1 2 3 4 5 6 7 8
| [Desktop Entry] Name=Obsidian Sync Comment=執行 Rclone 備份與同步 Obsidian Exec=konsole --noclose --workdir /home/USERNAME/Documents/Dropbox_Obsidian -e /home/USERNAME/Documents/Dropbox_Obsidian/improved-rclone-bisync-git-script.sh Icon=folder-sync Terminal=false Type=Application Categories=Utility;
|
之後啟動 KDE 桌面的時候就會自動執行同步, 並且跳出視窗說明同步進展, 萬一有狀況可以手動介入處理 ,不過 RCLONE 速度有點慢, 還是比不上 Dropbox Windows Client
另外我也把 obsidian_sync.desktop 複製到桌面, 就可以手動同步
然後把 improved-rclone-bisync-git-script.sh 檔案放在 ~/.config/plasma-workspace/shutdown/
, 關機的時候就會再同步一次
參考資料
參考資料:
RCLONE Bisync 官方文件
Arch Wiki : KDE