From 10c59e3d86b519c2bb044efacbddbf744bdd64e8 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 20:09:04 +0900 Subject: [PATCH] update --- ...bsidianノートの作成日を後から復元したい.md | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/content/Obsidianノートの作成日を後から復元したい.md b/content/Obsidianノートの作成日を後から復元したい.md index d316e5b6..3a9d8a2a 100644 --- a/content/Obsidianノートの作成日を後から復元したい.md +++ b/content/Obsidianノートの作成日を後から復元したい.md @@ -7,17 +7,18 @@ date: "2024-02-08T17:18:56+0900" - [[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のうち一番古いものをフロントマッターに上書きする +- `getfileinfo`や`stat -f " %SB"`でもファイル作成日は取得できるが、シェルスクリプトでファイルの中身を書き換えるとcreated dateが結構すぐ変わってしまう(sedとか) + - また、gitで複数環境で作業している場合、リモートで作ったファイルはgit pullした日がBirth Dateになる +- なので、次のようなシェルスクリプトを各git環境で実行することで、フロントマッター、全ての環境でのBirth date、もしくはgit blameしたうちの最古のコミット履歴のタイムスタンプのうちから一番古いものをフロントマッターに上書きする - 必要なツールはいずれもbrewで入れられる - `gsed`(フロントマッターのない記事に新たにメタデータを作る。macのsedは使用が違ってややこしいためgsedを使った) - `yq`(yamlをいい感じに書き換えてくれる) +- 実装が雑なのでフロントマッターがないファイルは2回実行せんとダメかも ```bash #!/bin/bash cwd=`dirname "${0}"` + function rewritedate () { echo "$1 : $2" echo $2 | xargs -I{} yq -i --front-matter="process" '.date="{}"' "$1" @@ -27,19 +28,29 @@ IFS=$'\n' for f in $FILES do BDATE=$(stat -f "%SB" "$f"); +DATE=$(LC_ALL=C date -j -f "%b %d %H:%M:%S %Y" "$BDATE" "+%FT%T%z"); 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"); + +LOCALDATE=$(LC_ALL=C date -j -f "%b %d %H:%M:%S %Y" "$BDATE" "+%s" ); +GITDATERAW=$(git blame $f |tail -1| grep -Eo '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'); +GITDATE=$(LC_ALL=C date -j -f "%Y-%m-%d %H:%M:%S" "$GITDATERAW" "+%s"); +GITDATE_2=$(LC_ALL=C date -j -f "%Y-%m-%d %H:%M:%S" "$GITDATERAW" "+%FT%T%z"); if [[ "$FLINE" == "---" ]]; then +ORIGINDATE_RAW=$(yq --front-matter=extract '.date' "$f") +ORIGINDATE=$(date -j -f "%FT%T%z" "$ORIGINDATE_RAW" "+%s") + 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 + rewritedate $f $DATE +fi + +if [ $GITDATE -lt $LOCALDATE ]; then + echo "Oldest commit date is older than birth date. overwriting" + rewritedate $f $GITDATE_2 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