我如何在一天内用 Claude Code 整理了 3,674 个 Obsidian Vault 文件

发布: (2026年2月16日 GMT+8 21:59)
13 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I’ll need the text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source link, formatting, markdown, and any code blocks exactly as they are while translating the rest into Simplified Chinese.

介绍

我在 Obsidian Vault 中拥有 3,674 个从 Evernote、Apple Notes 和 Apple Journal 导出的 Markdown 文件。没有 front‑matter、没有标签、没有分类。网页剪辑与我的原创写作混在一起,重复文件遍布各处。
我在一天内使用 Claude Code (Opus 4.6) 完成了全部整理。

指标

指标之前之后
文件总数3,674~1,000
带 front‑matter 的文件0全部
重复文件2,7510
MOCs(Map of Content)05
插件(已配置)010
模板06

Obsidian 拥有丰富的社区插件生态。仅靠 GUI 操作无法实现对 3,674 个文件批量插入 front‑matter、基于文件夹结构打标签、检测并删除重复文件,以及批量编辑插件的 JSON 设置。

使用 Claude Code,我可以在终端中完成所有这些操作:

  • 生成并运行 Python 脚本 – 用 Python 编写分类逻辑并立即执行。
  • 逐文件内容判断 – 在混合文件夹中逐个读取 100 多个文件并进行分类。
  • JSON 编辑插件设置 – 批量更新 10 个插件的配置。
  • 快速迭代 – 修复出错的脚本后立即重新运行。

简而言之,“对大量文件进行规则驱动和判断驱动的混合处理”正是 Claude Code 的强项。

Source:

Front‑matter 插入

我让 Claude Code 生成并运行了一个 Python 脚本,将以下结构的 front‑matter 插入 3,491 个 Markdown 文件:

---
category: tech        # tech / personal / creative / reference
type: fleeting        # fleeting / literature / permanent / moc
status: draft         # draft / review / done
tags:
  - journal
  - reflection
source: evernote      # evernote / apple-notes / apple-journal
date: "2020-01-15"
---

我为 26 个文件夹定义了 folder‑to‑tag 映射,bulk_frontmatter.py 处理了全部 3,491 个文件,没有出现任何错误

macOS 文件名规范化

从 Apple Notes 导出的文件出现了神秘的文件名匹配失败。原因是 macOS 文件系统使用 NFD(Normalization Form D),而 Python 字符串字面量是 NFC

# macOS filesystem stores filenames in NFD
# Python string literals are NFC
# → They don't match

import unicodedata

# Solution: Normalize to NFC before comparison
normalized = unicodedata.normalize("NFC", filename)

提示: 如果你在 macOS 上编写处理非 ASCII 文件名的 Python 脚本,unicodedata.normalize("NFC") 是必不可少的。这适用于任何文件操作,而不仅仅是 Obsidian。

重复与低内容删除

  • Evernote 导出 会生成大量遵循 2.md 模式的重复文件。我使用正则表达式检测它们,核对与原文件的差异后将其删除。
  • 我还删除了字符数极低(≤ 50 个字符、仅包含统计表格等)的文件。阈值因文件夹而异——日记文件夹被排除在外,因为即使是短篇条目也具有价值。

失败的尝试:平假名比例启发式

我假设自己的写作会有更高的平假名比例,于是尝试基于此进行过滤。结果失败,因为日本网页文章同样拥有高平假名比例,导致大量误分类。

# This didn't work
def is_personal(text: str) -> bool:
    hiragana = sum(1 for c in text if '\u3040'  0.3  # No threshold gave acceptable accuracy

成功的尝试:文件夹级别分类

最终,Evernote 时代的文件夹结构成为最可靠的分类依据。

  • 明确包含本人写作的文件夹(日记、随笔)被保留。
  • 以网页剪辑为主的文件夹(Study、Lifehack 等)被整体移动到归档。

只有混合文件夹(例如 Inbox)需要 Claude Code 逐个读取并判断文件。 在 124 个文件中,47 个被归类为个人写作,77 个被归类为网页剪辑,准确率很高。

经验教训: 通过自然语言的统计特征来区分内容来源是困难的。元数据(文件夹结构、文件名模式)要可靠得多。

插件配置

在完成金库结构后,我安装并配置了以下插件:

插件用途配置亮点
Dataview基于元数据的查询与仪表盘启用 JS 查询与内联
Linter自动格式化 front‑matter修复 YAML 键顺序,删除重复标签
Templater模板引擎文件夹‑模板关联
Tag Wrangler批量标签重命名与合并整理了 77 个标签
Calendar日历视图日语地区设置,周一为周首日
Auto Note Mover自动归类新笔记漏斗至 Inbox,排除旧文件夹
QuickAdd快速捕获3 条特定用途命令
Graph知识图谱可视化按文件夹颜色编码
Smart Connections语义搜索与相关笔记切换为多语言模型(见下文)
Periodic Notes每日/每周/每月笔记模板集成

Obsidian 将插件设置保存在 .obsidian/plugins/{plugin‑name}/data.json 中。直接用 Claude Code 编辑此 JSON 可以省去在 GUI 中逐项点击的繁琐。不过,需要注意以下重要事项:

不要在 Obsidian 运行时编辑设置。 Obsidian 会将设置加载到内存中,CLI 的编辑会在下次保存时被覆盖。请务必在编辑前退出 Obsidian。

金库根目录混淆

在会话期间,我遇到插件设置更改毫无效果的问题。调查发现金库指向了 父目录,导致出现了两个 .obsidian 目录:

Documents/                  ← Obsidian 将此识别为金库根目录
├── .obsidian/              ← 该配置为活动的
└── Obsidian Vault/
    ├── .obsidian/          ← 该目录被忽略
    └── (实际笔记)

将正确的 .obsidian 目录合并后问题得到解决。

经验教训: 当插件设置未生效时,首先运行
find . -name ".obsidian" -type d 检查 .obsidian 的实际位置。

Smart Connections 小问题

  • 默认的嵌入模型 TaylorAI/bge-micro-v2 侧重英文,在非英文金库中表现不佳。
  • 此外,该插件的设置并非保存在 data.json 中,而是存放在 .smart-env/smart_env.json
# Important: edit .smart-env/smart_env.json, not the usual data.json

切换到多语言模型(例如 intfloat/multilingual-e5-base)后,我的日语为主的金库重新获得了有用的语义搜索功能。

要点

  1. 批量操作(前置元数据插入、标签批量重命名、重复项删除)最好通过脚本而不是 GUI 来执行。
  2. 文件系统规范化 在 macOS 上很重要;在比较之前务必将文件名规范化为 NFC。
  3. 元数据胜过启发式——文件夹结构和文件名模式远比语言统计技巧更可靠。
  4. 插件设置 应离线编辑,并且必须确保正在编辑正确的 .obsidian 目录。
  5. 对于多语言库,为语义搜索插件选择合适的嵌入模型

在 Claude Code 负责繁重工作后,我在一天内将一个混乱的 3,674 文件的垃圾库整理成一个整洁、可搜索且结构良好的 Obsidian 库。

摘要

  • 问题: Obsidian Smart Connections 使用了默认的英文嵌入模型,无法捕捉多语言之间的关联。
  • 解决方案: 将嵌入模型切换为 Xenova/multilingual-e5-small 并重新索引库。
  • 结果: 相关笔记现在能够跨语言显示准确的连接。

经验教训:
Obsidian 插件的设置并不总是存储在 data.json 中。当某个设置似乎没有生效时,还需要检查 .obsidian/plugins/{plugin}/ 之外的文件(例如 .smart‑env/)。

配置更改

// .smart-env/smart_env.json
{
  "smart_sources": {
    "embed_model": {
      "model_key": "Xenova/multilingual-e5-small"
    }
  }
}

在更新模型键并清除嵌入缓存以进行全新重新索引后,多语言连接正确显示。

组织 Vault

1. 内容地图 (MOCs)

MOC 是一种笔记,用于列出同一主题下的其他笔记,采用手动链接和 Dataview 查询相结合的方式。示例查询:

TABLE date, status
FROM #books
SORT date DESC

2. Dataview 仪表盘

仪表盘显示:

  • 按状态划分的笔记数量
  • 最近更新的笔记
  • 未分类的笔记

启用 Dataview 的 JS 查询 可实现更灵活的聚合。

使用 Claude Code 进行自动化

我对一个托管在 iCloud 的 Obsidian vault(3,674 个 .md 文件)使用了 Claude Code。由于令牌限制,直接将所有文件喂给 Claude 并不可行,于是工作流程变为:

  1. 使用 Claude 生成 Python 脚本
  2. 在本地运行脚本
  3. 检查结果,修复任何问题,然后重复上述步骤。

使用的脚本

脚本目的处理的文件数
bulk_frontmatter.py批量插入 front‑matter3,491
apple_notes_folders.py基于子文件夹的分类66
apple_notes_root.py基于内容分析的分类86
vault_audit.py标签分布与缺口检测全部
tag_cleanup.py标签合并与重命名全部

技术要点

  • macOS + 非 ASCII 文件名 → 必须使用 unicodedata.normalize("NFC") 对路径进行规范化。
    • NFD/NFC 不匹配会导致文件搜索、模式匹配以及字典键查找失败。
  • 备份策略:
    • 在批量操作前创建 tar.gz 备份。
    • 平假名比例 分类失败,导致需要恢复。
    • 拥有快速恢复的备份可以实现“尝试 → 失败 → 恢复”的快速循环。
  • 插件设置:
    • 直接编辑 JSON 可行,但 仅在退出 Obsidian 后 生效。
    • 注意保险库根目录问题以及非标准设置文件。

关键要点

  1. 批量处理 = 代码生成 + 本地执行

    • 不要把每个文件都喂给 Claude;将逻辑编码为 Python(或其他语言)并自行运行。
  2. 元数据胜过启发式

    • 文件夹结构和 front‑matter 远比统计启发式(例如平假名比例)更可靠。
  3. Smart Connections 多语言支持

    • .smart‑env/smart_env.json 中切换为 multilingual‑e5‑small
  4. Unicode 正规化在 macOS 上对非 ASCII 文件名至关重要

  5. Claude Code 是通用组织器

    • 与基于规则的批处理脚本以及偶尔的内容驱动人工判断相结合时表现出色。

以上所有方法让我在一天内重新组织了整个包含 3,674 条笔记的库。

0 浏览
Back to Blog

相关文章

阅读更多 »

n8n 是纯粹的精彩

!Miguel Valdeshttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2...