[obsidian] vault backup: 2024-02-08 18:26:03
All checks were successful
Build / build (push) Successful in 1m43s
All checks were successful
Build / build (push) Successful in 1m43s
This commit is contained in:
parent
72368b208c
commit
521d59343e
53
content/Obsidianノートの作成日を後から復元したい.md
Normal file
53
content/Obsidianノートの作成日を後から復元したい.md
Normal file
@ -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ベースだから若干使用が違うのもあってめちゃくちゃ混乱した
|
Loading…
Reference in New Issue
Block a user