Auto Note Mover 文件夹同名冲突排查记录

一句话总结:Auto Note Mover 通过 tag 匹配文件名来移动文件。截至目前共发现 3 个独立坑,已全部有对应解决方案。坑③(触发标签残留)是最根本的——去除不必要的 tag,一切迎刃而解。


根因概述(当前总览)

Auto Note Mover 插件的核心机制:检测文件包含某 tag → 移动到对应名称的文件夹。核心问题在于插件按文件夹名称(而非路径)匹配,导致多个同层次同名文件夹冲突。

已知三大坑

#问题状态一句话解决
同名文件夹冲突 — 网站展示/复盘/ vs 复盘/,插件优先匹配根目录✅ 已修复复盘/复盘日志/ 消除同名
excluded_folder JSON 尾逗号导致解析失败,排除项失效✅ 已修复移除逗号,json.loads() 验证
触发标签残留 — 文件已到目标目录,但 tag 还在 → 一编辑又跑✅ 已修复文件到达最终位置后,去掉路由 tag

根本解决方案(当前最佳实践)

核心原则:tag 是路由标识,不是内容标签。文件到达最终目录后,tag 使命即完成。

文件保存在是否需要路由 tag操作
Inbox/✅ 需要保留(等待自动分类)
手册/笔记/复盘/✅ 需要(原地不动)保留
网站展示/ 下的子目录❌ 不需要发布时去掉路由 tag
网站展示/DacAI专栏/❌ 不需要去掉 tag
网站展示/基础设施/❌ 不需要去掉 tag

发布到网站展示的三步保险:

  1. 复制文件到网站展示对应子目录
  2. 移除路由 tag(如 #手册#复盘#笔记
  3. 确认 excluded_folder 有对应子目录路径 + JSON 格式合法

验证 JSON 合法性:

python3 -c "
import json
data = json.load(open('/mnt/d/个人知识库/.obsidian/plugins/auto-note-mover/data.json'))
print('排除项:', [e['folder'] for e in data.get('excluded_folder', [])])
"

历史记录(按时间追加)

2026-04-29 第一次:文件夹同名冲突

表现:编辑 网站展示/复盘/ 下的文件后,自动被移到根目录 复盘/

根因:Auto Note Mover 按文件夹名称(而非路径)匹配目标文件夹。网站展示/复盘/复盘/ 在插件的目标匹配中同时命中”复盘”名称,但 复盘/ 是首条规则所在文件夹,优先被移走。

修复:将 网站展示/复盘/ 重命名为 网站展示/复盘日志/,并在 exclued_folder 中添加路径。

遗留问题:excluded_folder 实际未生效(当时未知原因)。

教训:同名文件夹是插件配置的隐蔽陷阱。按名称匹配的规则遇到同名目录时,行为不可预期。


2026-04-30 第二次:JSON 尾逗号导致排除失效

表现:排除项配置后完全不生效。

根因excluded_folder 配置存在尾逗号:

"excluded_folder": [
    { "folder": "网站展示" },
    { "folder": "网站展示/复盘日志" },    尾逗号
]

JSON 标准禁止尾逗号,JSON.parse() 抛出异常,排除数组回退为默认值 [{folder:""}],排除机制形同虚设。尾逗号的产生原因是:用 patch 工具删除空条目时,未将前一项末尾的逗号一并纳入替换范围。

修复:手动清除尾逗号,用 json.loads() 验证。

教训:程序化修改 JSON 后,末尾条目的逗号残留可能导致解析失败。写入前建议用 json.loads() 验证格式。


2026-04-30 第三次:触发标签残留

表现:通过 cp 复制到 网站展示/基础设施/ 后,文件自动消失(再次出现在 手册/)。

根因:文件的 frontmatter 中包含 tags: [手册, ...]。Auto Note Mover 检测到 #手册 tag → 自动移回 手册/ 目录。排除列表中已有 网站展示 但未递归保护子目录。

修复

  1. 删除网站展示副本中的 手册 tag(改为 tags: [Hermes, Agent, 效率, 指南]
  2. 重新 cp 到网站展示目录
  3. 确认文件留在原位

教训:tag 的路由使命在文件到达目标目录后即告完成。保留 tag 可能被插件重新捕获,形成死循环。发布到数字花园的副本必须安全移除路由 tag。


复盘日志持续更新中 — 新发现的新坑按日期追加至此