quartz-research-note/content/Obsidianノートの作成日を後から復元したい.md
松浦 知也 Matsuura Tomoya d546b02cc4
All checks were successful
Build / build (push) Successful in 1m43s
[obsidian] vault backup: 2024-02-08 19:14:51[
2024-02-08 19:14:51 +09:00

2.6 KiB
Raw Blame History

date
2024-02-08T17:18:56+09:00

#tips #obsidian

  • MacOS前提です
  • Quartzで公開する際、記事ののcreated dateとlast modified dateを管理したいが、前者はgitの情報から得るのが難しい
    • 知らんけど多分ファイルのリネームとかの問題があるからだと思う
  • ファイルシステムのタイムスタンプを使えばいいが、リモートマシンではgit pushされた時に作成されたことになってしまうので、ローカルのタイムスタンプの情報を引っこ抜いて、frontmatterに記入したい
  • getfileinfoでもファイル作成日は取得できるが、シェルスクリプトでファイルの中身を書き換えるとcreated dateが結構すぐ変わってしまうsedとか
  • しかし、stat -f "%SB"で得られるBirth Dateは残っていることが多い
    • ただ、gitで複数環境で作業している場合、リモートで作ったファイルはgit pullした日がBirth Dateになる
  • なので、次のようなシェルスクリプトを各git環境で実行することで全ての環境でのBirth dateのうち一番古いものをフロントマッターに上書きする
    • 必要なツールはいずれもbrewで入れられる
      • gsed(フロントマッターのない記事に新たにメタデータを作る。macのsedは使用が違ってややこしいためgsedを使った)
      • yq(yamlをいい感じに書き換えてくれる)
#!/bin/bash
cwd=`dirname "${0}"`
function rewritedate () {
	echo "$1 : $2"
	echo $2 | xargs -I{} yq -i --front-matter="process" '.date="{}"' "$1"
}
FILES=$(find $cwd/content -name "*.md")
IFS=$'\n'
for f in $FILES
do
BDATE=$(stat -f "%SB" "$f");
FLINE=$(head -n 1 "$f");
ORIGINDATE=$(yq --front-matter=extract '.date' "$f" | date "+%s")
LOCALDATE=$(LC_ALL=C date -j -f "%b %d %H:%M:%S %Y" "$BDATE" | date "+%s");
if [[ "$FLINE" == "---" ]];
then
if [ $LOCALDATE -lt $ORIGINDATE ]; then 
    echo "$f has frontmatter and date of local file is older. overwriting."
    DATE=$(LC_ALL=C date -j -Iseconds -f "%b %d %H:%M:%S %Y" "$BDATE");
    rewritedate $f $BDATE
fi
else
echo "$f has no frontmatter, adding to it";
DATE=$(LC_ALL=C date -j -Iseconds -f "%b %d %H:%M:%S %Y" "$BDATE");
gsed -i '1i---\n---' "$f"
rewritedate $f $DATE
fi
done

ハマるポイント

dateのフォーマットをパースする際にLC_ALL=Cの環境変数がないと、statコマンドで出てくるNovみたいな月の短縮系をパースできない。macのdateコマンドはFreeBSDベースだから若干使用が違うのもあってめちゃくちゃ混乱した