From 521d59343e2fe87b79ac82c63c5b7cbb4b6adee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Thu, 8 Feb 2024 18:26:03 +0900 Subject: [PATCH] [obsidian] vault backup: 2024-02-08 18:26:03 --- ...bsidianノートの作成日を後から復元したい.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 content/Obsidianノートの作成日を後から復元したい.md diff --git a/content/Obsidianノートの作成日を後から復元したい.md b/content/Obsidianノートの作成日を後から復元したい.md new file mode 100644 index 00000000..366fdf8f --- /dev/null +++ b/content/Obsidianノートの作成日を後から復元したい.md @@ -0,0 +1,53 @@ +--- +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をいい感じに書き換えてくれる) + +```bash +#!/bin/bash +#別のマシンで作ったファイルのBirth Dateはわからんので、それぞれのマシンで実行して古い方で上書きする +cwd=`dirname "${0}"` +FILES=$(find $cwd/content -name "*.md") +IFS=$'\n' +for f in $FILES +do +BDATE=$(stat -f "%SB" "$f"); +FLINE=$(head -n 1 "$f"); +if [[ "$FLINE" == "---" ]]; +then +echo "$f has frontmatter"; +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 [ $LOCALDATE -lt $ORIGINDATE ]; then #古い方で上書き + echo "date of local file is older. overwriting." + DATE=$(LC_ALL=C date -j -Iseconds -f "%b %d %H:%M:%S %Y" "$BDATE"); + echo "$f : $DATE" + echo $DATE | xargs -I{} yq -i --front-matter="process" '.date="{}"' "$f" +fi +#フロントマターがあって、その日付が最古なら何もしない +else +echo "$f has no frontmatter, adding"; +gsed -i '1i---\n---' "$f" +DATE=$(LC_ALL=C date -j -Iseconds -f "%b %d %H:%M:%S %Y" "$BDATE"); +echo "$f : $DATE" +echo $DATE | xargs -I{} yq -i --front-matter="process" '.date="{}"' "$f" +fi +done +``` + +## ハマるポイント + +dateのフォーマットをパースする際に`LC_ALL=C`の環境変数がないと、statコマンドで出てくる`Nov`みたいな月の短縮系をパースできない。macのdateコマンドはFreeBSDベースだから若干使用が違うのもあってめちゃくちゃ混乱した