--- 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 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ベースだから若干使用が違うのもあってめちゃくちゃ混乱した