1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Obsidianで自動的にFrontmatterを付与する仕組みをmacOSで常駐化した話

Last updated at Posted at 2025-07-01

はじめに

ObsidianでWebクリップやメモを管理していると、新しく追加したMarkdownファイルに毎回Frontmatter(YAMLヘッダー)を手動で付けるのが面倒だと感じたことはありませんか?
今回は、WebClipsフォルダに新しい.mdファイルが追加されたとき、自動でFrontmatterを付与する仕組みをシェルスクリプト+macOSのlaunchdで常駐化した手順をまとめます。


目標

  • WebClipsフォルダに新しいMarkdownファイルが追加 or 移動されたとき
  • 自動でFrontmatter(タイトル・日付など)を付与
  • macOS起動時やObsidian起動時に自動で常駐

1. 監視スクリプト(add_frontmatter.sh)の作成

まずは、WebClipsフォルダを監視し、.mdファイルが追加・移動されたときにFrontmatterを自動付与するシェルスクリプトを作成しました。

ポイント

  • fswatchコマンドでフォルダをリアルタイム監視
  • ファイル名に空白や記号が含まれていても正しく処理
  • Frontmatterが既にある場合はスキップ
  • ファイル名を日付+元ファイル名にリネーム
  • ファイルが移動されてきたかはRenamedで判断

スクリプト例

#!/bin/bash

WATCH_DIR="WebClips"

fswatch -0 -x "$WATCH_DIR" | while read -d "" line
do
  # .mdまでをファイル名として抽出
  file=$(echo "$line" | sed -E 's/(.*\.md) .*/\1/')
  # .md以降をイベント名として抽出
  events=$(echo "$line" | sed -E 's/.*\.md //')
  if [[ ( "$events" == *Created* || "$events" == *Renamed* ) && "$file" == *.md && -f "$file" ]]; then
    if ! head -n 1 "$file" | grep -q "^---"; then
      FRONTMATTER="---
title: \"$(basename \"$file\" .md)\"
date: \"$(date '+%Y-%m-%d')\"
category: []
tags: []
nextActions: []
publish: false
---"
      formatted_time=$(date '+%Y-%m%d-%H%M%S')
      base_name=$(basename "$file" .md)
      created_id="${formatted_time}-${base_name}"

      tmpfile=$(mktemp)
      echo "$FRONTMATTER" > "$tmpfile"
      cat "$file" >> "$tmpfile"
      mv "$tmpfile" "$WATCH_DIR/$created_id.md"
      rm "$file"
      echo "Frontmatter added to $created_id.md"
      sleep 1
    fi
  fi
done

2. launchdで自動常駐化

macOSのlaunchdを使い、スクリプトをログイン時や再起動時に自動で起動・常駐させる設定を行いました。

手順

  1. スクリプトに実行権限を付与

    chmod +x /Users/yshi112358/Documents/Obsidian-x-Cursor/add_frontmatter.sh
    
  2. plistファイルを作成
    local.obsidian.addfrontmatter.plist という名前で以下の内容を作成:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>Label</key>
        <string>local.obsidian.addfrontmatter</string>
        <key>ProgramArguments</key>
        <array>
            <string>/Users/yshi112358/Documents/Obsidian-x-Cursor/add_frontmatter.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <true/>
        <key>WorkingDirectory</key>
        <string>/Users/yshi112358/Documents/Obsidian-x-Cursor</string>
        <key>StandardOutPath</key>
        <string>/tmp/add_frontmatter.log</string>
        <key>StandardErrorPath</key>
        <string>/tmp/add_frontmatter.err</string>
    </dict>
    </plist>
    
  3. LaunchAgentsに配置し、読み込む

    mkdir -p ~/Library/LaunchAgents
    cp local.obsidian.addfrontmatter.plist ~/Library/LaunchAgents/
    launchctl load ~/Library/LaunchAgents/local.obsidian.addfrontmatter.plist
    

3. 動作確認

  • WebClipsフォルダに新しい.mdファイルを追加・移動すると、自動でFrontmatterが付与され、ファイル名も日付付きにリネームされることを確認。
  • ログは/tmp/add_frontmatter.log/tmp/add_frontmatter.errで確認可能。

まとめ・感想

手作業でFrontmatterを付ける手間がゼロになり、Obsidianでの情報整理がさらに快適になりました!
macOSのlaunchdとシェルスクリプトの組み合わせは、**「ちょっとした自動化」**にとても便利です。


おまけ:トラブルシューティング

  • ファイル名に空白がある場合の正規表現や、fswatchの出力形式の違いに注意
  • launchdのplistは~/Library/LaunchAgents/に配置
  • スクリプトの無限ループやエラー時の挙動も要チェック

Obsidianや自動化に興味がある方の参考になれば幸いです!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?