🎃

怠惰な人のためのobsidian同期

2023/08/14に公開

概要📝

Obsidianはカスタマイズ性に優れたエディタのため、多様な同期方法が存在します。この方法は、その中でも簡単に同期を行うことに重きを置いた方法です。

仕組み🛠️

Google Cloud Storageに保管庫を設置し、これを更新しています。シェルスクリプトになっているので、手動かcrontab等で自動実行するように設定します。

  1. リモートストレージのタイムスタンプファイルをチェック。ローカルのタイムスタンプファイルがリモートより古い場合、リモートの状態に同期。
  2. 逆にローカルが新しい場合、リモートストレージをローカルの状態に同期。

余談

仕組みとしては、Google Driveに保管庫を設置して同期する方法と変わりませんが、その場合、もっさり感があり、自前で更新することで、これを回避したいという思惑です。

注意点😯

  • 複数の端末から同時に編集するような、ライブ編集には非対応
  • パソコン専用。

ソースコード💻

#!/bin/bash

LOCAL_VAULT_PATH="local_obsidian_volt_path/"
GCS_BUCKET_PATH="gs://remote_obsidian_volt_path"
METADATA_FILE="last_sync_timestamp.txt"
LOCAL_METADATA="$LOCAL_VAULT_PATH/$METADATA_FILE"
GCS_METADATA="$GCS_BUCKET_PATH/$METADATA_FILE"

echo "開始: GCSのメタデータファイルの存在確認..."
 
# GCSからメタデータファイルを取得
if gsutil -q stat $GCS_METADATA; then
echo "GCSにメタデータファイルが存在します。ローカルにコピーします..."
gsutil cp $GCS_METADATA $LOCAL_METADATA.tmp
else
echo "GCSにメタデータファイルが存在しません。ローカルに新しいファイルを作成します..."
touch $LOCAL_METADATA.tmp
fi 

echo "タイムスタンプを読み取り、比較を開始します..."
# タイムスタンプの比較
LOCAL_TIMESTAMP=$(cat $LOCAL_METADATA)
GCS_TIMESTAMP=$(cat $LOCAL_METADATA.tmp)

if [[ $GCS_TIMESTAMP > $LOCAL_TIMESTAMP ]]; then
echo "GCSの方が新しい変更があります。ローカルに同期を開始します..."
# GCSの変更をローカルに同期
gsutil rsync -r $GCS_BUCKET_PATH $LOCAL_VAULT_PATH
else
echo "ローカルのデータが最新のようです。GCSの同期はスキップします。"
fi 

echo "ローカルの変更内容をGCSにアップロードします..."
# ローカルの変更をGCSに同期
gsutil rsync -r $LOCAL_VAULT_PATH $GCS_BUCKET_PATH

echo "ローカルのメタデータファイルのタイムスタンプを更新し、GCSにアップロードします..."
# メタデータファイルを更新
date +%s > $LOCAL_METADATA
gsutil cp $LOCAL_METADATA $GCS_METADATA

echo "全ての同期処理が完了しました!"

Discussion