三年前从 Obsidian 搬到 Notion,三年后又搬回来。这次搬家花了四个小时,比预期多一倍。
不是因为操作复杂,是因为 Notion 的导出质量太差,清理数据占了三小时。
这篇不是工具横评,是一次具体迁移的操作记录。如果你也想从 Notion 搬出来,照着做能少踩几个坑。
第一步,导出
Notion 的导出功能给两个选项,Markdown 和 HTML。选了 Markdown,下载下来一个 zip。
解压后第一眼就知道麻烦来了,
- 文件名里带特殊字符的全部乱码,
产品需求文档/PRD v2.0.md变成了PRD%20v2%2E0%20%E4%BA%A7%E5%93%81.md - 附件(图片、PDF)散落在各个目录里,有些链接断了
- 数据库视图导出成了独立的 CSV,和正文完全脱节
- 内部链接(Notion 的 mention)全部变成了纯文本,跳转关系全丢了
800 多个 block 的工作区,导出来能直接用的不到 70%。
第二步,修文件名
写了个 Python 脚本批量 URL decode 文件名,
import os
import urllib.parse
for root, dirs, files in os.walk('.'):
for name in files + dirs:
decoded = urllib.parse.unquote(name)
if decoded != name:
old_path = os.path.join(root, name)
new_path = os.path.join(root, decoded)
os.rename(old_path, new_path)跑完之后文件名正常了,但目录结构还是乱的。Notion 的数据库页面导出后会多一层 hash 目录,比如 a1b2c3d4/,里面放着一个 index.md 和相关附件。这些 hash 目录名没有任何意义,需要手动重命名。
200 多个目录,手动改了半小时。
第三步,修链接
Notion 的内部链接导出后变成纯文本,比如 @张三 或 页面标题,没有对应的 Markdown 链接。
我用 Obsidian 打开整个文件夹,利用它的双链功能重建关联。具体做法,
- 搜索每个页面标题,看哪些页面提到了它
- 手动把纯文本改成
[[页面标题]]格式 - 附件引用路径从相对路径改成 Obsidian 的
![[文件名]]格式
这一步最耗时,两小时。300 多条链接,一条一条改。
如果是纯文本笔记没有大量内部链接,这步可以跳过。
第四步,重建数据库
Notion 的数据库是核心功能,导出后变成 CSV + 独立的 Markdown 文件,关联全断了。
我的做法是用 Obsidian 的 Dataview 插件替代。原 Notion 数据库的每个属性变成 frontmatter 字段,
---
status: done
priority: high
tags: [项目A, 后端]
created: 2024-03-15
---Dataview 查询替代 Notion 的筛选视图,
TABLE status, priority, created
FROM "projects"
WHERE status = "done"
SORT priority DESC不如 Notion 直观,但够用。关键是数据在 Markdown 文件里,Dataview 只是查询层,插件哪天不能用了,文件还在。
第五步,配置同步
Git 做版本控制,本地 repo + Gitea 远程备份。
Syncthing 做设备同步,手机和电脑点对点,不经过第三方服务器。配置很简单,选一个共享文件夹,两边都装 Syncthing,自动发现。
有个坑,Syncthing 同步 .obsidian 配置目录时,不同设备的插件配置会打架。解法,在 .stignore 里排除 .obsidian/workspace.json,这个文件包含窗口布局和打开的标签页,每台设备应该独立维护。
搬完之后的感受
最大的变化不是功能层面,是心理层面的。
Notion 里每次新建页面都有一种”正式感”,要选数据库、填属性、考虑放在哪个层级。这种仪式感在用 Notion 初期很好,时间长了反而成了阻力。
Obsidian 里 Ctrl+N 直接开写,不选位置、不填属性、不思考层级。先写下来,整理的事以后再说。
延迟也消失了。Notion 打开半秒、新建页面半秒、搜索一秒。Obsidian 全部瞬时。这点延迟差异在单次操作时感受不到,一天记十次笔记就差了二十多秒,够打断”随手记一笔”的冲动。
搬迁清单
如果你也要搬,按这个顺序来,
- Notion 里先整理,删掉不需要的页面,减少导出量
- 导出 Markdown,解压
- 跑 URL decode 脚本修文件名
- 手动整理 hash 目录名
- 用 Obsidian 打开文件夹,重建双链
- 数据库属性转 frontmatter,Dataview 替代视图
- Git init,推到远程
- Syncthing 配设备同步,
.stignore排除 workspace.json
整个过程,页面少的话两小时,多了半天。比从 Notion 导出后花时间骂 Notion 强。