[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:
		
							
								
								
									
										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ベースだから若干使用が違うのもあってめちゃくちゃ混乱した | ||||||
		Reference in New Issue
	
	Block a user