quartz-research-note/content/Obsidianノートの作成日を後から復元したい.md
松浦 知也 Matsuura Tomoya 10c59e3d86
All checks were successful
Build / build (push) Successful in 2m7s
update
2024-02-08 20:09:04 +09:00

63 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: "2024-02-08T17:18:56+0900"
---
#tips #obsidian
- MacOS前提です
- [[Quartz]]で公開する際、記事ののcreated dateとlast modified dateを管理したいが、前者はgitの情報から得るのが難しい
- 知らんけど多分ファイルのリネームとかの問題があるからだと思う
- ファイルシステムのタイムスタンプを使えばいいが、リモートマシンでは`git push`された時に作成されたことになってしまうので、ローカルのタイムスタンプの情報を引っこ抜いて、frontmatterに記入したい
- `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"
}
FILES=$(find $cwd/content -name "*.md")
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");
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."
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";
gsed -i '1i---\n---' "$f"
rewritedate $f $DATE
fi
done
```
## ハマるポイント
dateのフォーマットをパースする際に`LC_ALL=C`の環境変数がないと、statコマンドで出てくる`Nov`みたいな月の短縮系をパースできない。macのdateコマンドはFreeBSDベースだから若干使用が違うのもあってめちゃくちゃ混乱した