1. 笔记越记越多,为什么你的 Obsidian 知识库需要一份自动 MOC
我自己的 Obsidian 库现在有 400 多篇笔记,最乱的时候打开侧边栏,文件夹套文件夹,点进去全是没标题的2026-09-01.md。找一篇三个月前写的「用户留存」分析,翻了十分钟没找到,最后靠全局搜索关键词才捞出来。那一刻我意识到:知识库的问题不是记不住,是找不到。
MOC(Map of Content,内容地图)就是解决这个问题的。它本质上是一份目录笔记,用 Markdown 双链把散落在各个文件夹里的笔记按主题串起来。你打开这一篇,就能看到自己最近在关注什么、哪些主题笔记最多、哪些笔记写了却从没被引用过。
但手动维护 MOC 是反人性的。每次新增十几篇笔记,你都得回头改目录,改两次就放弃了。所以这篇要聊的是:让 Codex 自动扫描你的本地 Markdown 知识库,生成 MOC 目录结构和索引文件,再用 cron 定时任务每天自动更新。整个过程你只需要写一次提示词、配一次脚本,之后它自己跑。
适合谁看?用 Obsidian 或本地 Markdown 做知识管理、笔记量在 100 篇以上、不想手动整理目录的人。不需要你懂编程,shell 脚本和 cron 配置我都会给完整可复制的版本。核心工具是 Codex 命令行,通过 TaoToken 统一 Key 接入,把 endpoint 和 auth.json 改一次,后面所有自动化都走这个通道。
先说清楚 Codex 在这里扮演什么角色。它不是简单的文本生成器,而是能执行代码、遍历文件系统、读取每个文件内容的 Agent。你给它一个扫描指令,它会真的去ls你的文件夹、cat每个.md文件、统计双链引用次数,然后生成结构化的目录。这跟你在网页对话框里粘贴几段文字让它总结,完全是两回事。
我试过用普通对话模型做这件事,得先把几十个文件内容复制粘贴进去,上下文一超就截断,生成出来的目录还经常漏文件。Codex 的代码执行能力绕过了这个限制——它像跑脚本一样遍历目录,读多少文件都不怕。
下面按「前置准备 → 可复制配置 → 验证请求 → 排错 → 定时任务」的顺序走,每一步都有完整命令和预期结果。
2. TaoToken 前置准备:把 Codex 的 endpoint 与 auth.json 改到统一通道
在写 MOC 生成脚本之前,得先让 Codex 能正常调用模型。Codex 默认走 OpenAI 的接口,但国内直连经常超时,而且你得单独管理一个 Key。我的做法是把它统一改到 TaoToken 的 API 通道,一个 Key 管所有模型调用,后面写脚本时也不用在环境变量里塞一堆东西。
TaoToken 在这里的作用是统一的 API 接入层:你拿到一个 Key,把 Codex 的 Base URL 指向https://taotoken.net/api,Codex 发出的请求就会走这个通道。对 Codex 来说,它以为自己还在调 OpenAI 接口,实际上请求已经被转发到可用的模型上。你不需要改 Codex 的源码,只改两个配置文件。
先拿 Key。打开https://taotoken.net/api-keys(这是 deep link,直接进 Key 管理页),登录后创建一个新 Key,复制出来。这个 Key 后面要写进auth.json,所以先存到安全的地方,别贴在聊天记录里。
拿到 Key 之后,找到 Codex 的配置目录。不同系统路径不一样:
| 系统 | Codex 配置目录 | auth.json 路径 |
|---|---|---|
| macOS | ~/.codex/ | ~/.codex/auth.json |
| Linux | ~/.codex/ | ~/.codex/auth.json |
| Windows | %USERPROFILE%\.codex\ | %USERPROFILE%\.codex\auth.json |
如果你还没装 Codex CLI,先装。macOS 和 Linux 用 npm:
npm install -g @openai/codexWindows 用 PowerShell:
npm install -g @openai/codex装完执行codex --version,能打印版本号就说明 CLI 就位了。接下来改配置。
第一步,改 auth.json。这个文件存的是认证信息。如果文件不存在就新建一个,内容如下:
{ "OPENAI_API_KEY": "sk-你的TaoTokenKey" }把sk-你的TaoTokenKey换成你刚才复制的 Key。注意这个文件是 JSON 格式,引号和逗号不能少,最后一行不能有逗号。
第二步,改 config.toml。这个文件在同一个目录下,控制 Codex 的模型和 endpoint。没有就新建:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" wire_api = "responses"这里三个关键字段:base_url指向 TaoToken 的 API 地址,wire_api用responses协议(Codex 新版默认走这个),model填你要用的模型 ID。如果你不确定该填哪个模型 ID,可以打开https://taotoken.net/models看当前可用的列表,把对应的 ID 复制过来。
第三步,验证配置生效。在终端跑:
codex exec "print hello"如果返回一段包含hello的文本,说明 Codex 已经通过 TaoToken 通道正常调用了。如果报 401,说明 Key 没写对;如果报连接超时,检查base_url是不是写成了https://taotoken.net/api(注意结尾没有斜杠)。
这一步是整个自动化的地基。地基没打好,后面脚本跑起来全是认证错误。我见过太多人脚本写得没问题,卡在 auth.json 少了个引号上。
配置改完之后,Codex 的所有调用都会走 TaoToken。你后面写 MOC 生成脚本时,不需要在脚本里再塞 Key,Codex 自己会读~/.codex/auth.json。这就是统一 Key 的好处:配置一次,所有自动化任务共用。
3. 可复制配置:Codex 提示词模板 + shell 脚本 + cron 定时任务
这一节是核心,给你三样可以直接复制的东西:生成 MOC 的 Codex 提示词、调用它的 shell 脚本、以及每天自动跑的 cron 配置。我按「先手动跑通,再自动化」的顺序给,你别一上来就配 cron。
3.1 Codex 提示词模板
把下面这段存成一个文件,比如~/moc-prompt.md。Codex 支持从文件读提示词,这样你不用每次在命令行里敲一大段。
请扫描 my-knowledge-base 文件夹下的所有 .md 文件,完成以下任务: 1. 按文件夹分类,列出每个文件夹里的笔记文件名 2. 对 03-知识资产/ 和 04-产品库/ 里的笔记,读取内容后生成一句话简要描述 3. 统计每篇笔记被其他笔记双链引用的次数,找出被引用最多的前 10 篇 4. 找出孤立笔记:没有任何双链指向它,它也没有双链指向其他笔记 5. 列出最近 7 天修改过的笔记,按修改时间倒序 6. 生成一份 MOC 目录笔记,格式为 Markdown 双链列表,保存为 00-系统说明/知识库目录.md 输出格式要求: - 顶部写生成时间和扫描文件总数 - 每个文件夹作为一个二级标题,下面用 - [[笔记名]] 列出 - 被引用超过 10 次的笔记,在行尾标注 — 被引用 N 次 - 末尾单独加「孤立笔记」和「最近更新」两个板块 只读取内容,不要修改任何现有笔记。这里有几个设计点值得说。第一,明确要求「只读取,不修改」,防止 Codex 手滑改你的笔记。第二,要求统计引用次数,这是 MOC 最有价值的部分——你能看到哪个主题是真正在关注的。第三,孤立笔记板块帮你发现写了就忘的内容。
3.2 shell 脚本
把下面存成00-系统说明/更新目录.sh,放在你的知识库根目录下:
#!/bin/bash set -euo pipefail VAULT_DIR="$HOME/my-knowledge-base" PROMPT_FILE="$VAULT_DIR/00-系统说明/moc-prompt.md" OUTPUT_FILE="$VAULT_DIR/00-系统说明/知识库目录.md" LOG_FILE="$VAULT_DIR/00-系统说明/moc-更新日志.txt" cd "$VAULT_DIR" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始生成 MOC" >> "$LOG_FILE" codex exec --full-auto "$(cat "$PROMPT_FILE")" >> "$LOG_FILE" 2>&1 if [ -f "$OUTPUT_FILE" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] MOC 生成成功,文件大小 $(wc -c < "$OUTPUT_FILE") 字节" >> "$LOG_FILE" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] 错误:未生成 $OUTPUT_FILE" >> "$LOG_FILE" exit 1 fi几个关键参数解释一下。set -euo pipefail让脚本遇到错误就停,不会静默失败。--full-auto是 Codex 的自动执行模式,允许它读文件、跑命令,不用每步都问你。>> "$LOG_FILE" 2>&1把标准输出和错误都追加到日志,方便你回头查。
给脚本加执行权限:
chmod +x "$HOME/my-knowledge-base/00-系统说明/更新目录.sh"先手动跑一次:
~/my-knowledge-base/00-系统说明/更新目录.sh跑完打开00-系统说明/知识库目录.md,看看格式对不对。如果目录结构不是你想要的,回去改moc-prompt.md里的提示词,再跑一次。这一步别跳过,手动跑顺了再上定时任务。
3.3 cron 定时任务配置
确认手动跑没问题后,配 cron。执行:
crontab -e在打开的编辑器里加一行:
0 2 * * * /bin/bash "$HOME/my-knowledge-base/00-系统说明/更新目录.sh"这行的意思是每天凌晨 2 点执行脚本。0 2 * * *五个字段分别是分、时、日、月、周。如果你想改成每天早上 8 点,就写0 8 * * *。
保存退出后,用crontab -l确认任务已写入。macOS 用户注意:cron 在 macOS 上需要给终端「完全磁盘访问权限」,否则读不了你的知识库文件夹。去「系统设置 → 隐私与安全性 → 完全磁盘访问权限」,把终端加进去。
Windows 用户不用 cron,用任务计划程序。让 Codex 帮你生成对应的 PowerShell 脚本和任务配置:
codex exec "帮我写一个 PowerShell 脚本,调用 codex exec 扫描 my-knowledge-base 文件夹生成 MOC,并告诉我怎么用任务计划程序设置每天凌晨 2 点执行"Codex 会给你完整的.ps1文件和schtasks命令。
4. 验证请求与成功结果:跑一次目录生成并校验输出
配置写完了,得验证它真的能跑通。这一节我带你走一遍完整的验证流程,包括怎么判断生成结果是对的、怎么检查引用统计准不准。
先手动触发一次脚本:
~/my-knowledge-base/00-系统说明/更新目录.sh然后看日志:
tail -20 ~/my-knowledge-base/00-系统说明/moc-更新日志.txt正常的话你会看到类似这样的输出:
[2026-09-10 02:00:01] 开始生成 MOC [2026-09-10 02:00:03] 扫描到 87 个 .md 文件 [2026-09-10 02:00:15] 生成 00-系统说明/知识库目录.md [2026-09-10 02:00:15] MOC 生成成功,文件大小 4821 字节打开生成的知识库目录.md,应该长这样:
# 知识库目录 > 自动生成于 2026-09-10,共扫描 87 个文件 ## 01-内容生产(5 篇) - [[2026-codex-obsidian-knowledge-base]] - [[2026-codex-obsidian-note-2]] ## 02-输入处理(32 篇) - 2026-09-01 - 2026-09-02 ## 03-知识资产(18 篇) - [[用户留存]] — 被引用 23 次 - [[表单设计]] — 被引用 17 次 - [[Prompt工程]] — 被引用 15 次 ## 04-产品库(4 篇) - [[知识库搭建]] - [[产品迭代3.15]] ## 05-聊天记录(3 篇) - [[飞书对话片段]] ## 高频引用主题 1. 用户留存(23 次) 2. 表单设计(17 次) 3. Prompt工程(15 次) ## 孤立笔记 - [[某篇写了没用的笔记]] ## 最近更新 - [[2026-09-10-今天的笔记]] - [[2026-09-09-昨天的笔记]]怎么校验结果对不对?三个检查点。
第一,文件总数对不对。日志里说扫描到 87 个文件,你可以在终端跑find ~/my-knowledge-base -name "*.md" | wc -l数一下,两个数字应该一致。如果不一致,说明 Codex 漏扫了某些子文件夹。
第二,引用次数准不准。挑一篇你知道被引用多的笔记,比如「用户留存」,在终端跑:
grep -r "\[\[用户留存\]\]" ~/my-knowledge-base --include="*.md" | wc -l这个数字应该和 MOC 里标注的引用次数接近。如果差很多,可能是 Codex 统计时把某些格式的双链漏了,比如[[用户留存|别名]]这种带别名的写法。
第三,孤立笔记是不是真的孤立。随便挑一篇 MOC 里标为孤立的笔记,跑:
grep -r "笔记名" ~/my-knowledge-base --include="*.md"如果除了它自己之外没有其他文件提到它,那确实是孤立的。
验证通过后,你的知识库就有了一份自动维护的 MOC。每天凌晨 2 点,Codex 会重新扫描、重新生成,你早上打开 Obsidian 就能看到最新的目录。
5. 本篇常见错误排查:401、local proxy failed、reading choices 报错怎么修
这一节列几个我实际踩过的坑,都是配置 Codex + TaoToken + cron 时容易遇到的。每个错误给现象、原因、修法。
错误一:401 Unauthorized
现象:跑codex exec "print hello"返回401 Unauthorized或invalid api key。
原因:auth.json里的 Key 写错了,或者文件格式不对。
修法:打开~/.codex/auth.json,确认三件事。第一,Key 是完整的,没有多余空格。第二,JSON 格式正确,可以用cat ~/.codex/auth.json | python -m json.tool验证,能正常解析说明格式没问题。第三,Key 没有过期,去https://taotoken.net/api-keys看这个 Key 的状态。
错误二:local proxy failed / connection refused
现象:Codex 报local proxy failed或connection refused。
原因:config.toml里的base_url写错了,或者网络不通。
修法:确认base_url = "https://taotoken.net/api",注意结尾没有斜杠,协议是https。然后在终端跑curl -I https://taotoken.net/api,能返回 HTTP 状态码说明网络通。如果 curl 也超时,检查你的网络环境。
错误三:reading choices / unexpected response format
现象:Codex 报error reading choices或unexpected response format。
原因:wire_api配置和实际接口不匹配。Codex 新版默认用responses协议,但有些模型只支持chat协议。
修法:打开config.toml,把wire_api = "responses"改成wire_api = "chat",再试。如果还不行,去https://taotoken.net/models看你用的模型支持哪种协议,按文档填。
错误四:cron 任务不执行
现象:手动跑脚本没问题,但 cron 到点没反应。
原因:cron 的环境变量和你的终端不一样,找不到codex命令。
修法:在脚本开头加一行,把 codex 的路径写死。先跑which codex找到路径,比如/usr/local/bin/codex,然后在脚本的set -euo pipefail下面加:
export PATH="/usr/local/bin:$PATH"另外,cron 的日志默认发到系统邮件,你可以把脚本里的日志重定向保留,方便排查。
错误五:OAuth 相关报错
现象:Codex 提示OAuth token expired或要求重新登录。
原因:Codex 可能同时存在 OAuth 登录态和 API Key 认证,两者冲突。
修法:如果你只用 TaoToken 的 Key,就不需要 OAuth。跑codex logout清掉 OAuth 登录态,然后确认auth.json里只有OPENAI_API_KEY一个字段。重启终端再试。
错误六:生成的文件是空的
现象:脚本跑完,知识库目录.md存在但内容为空。
原因:Codex 执行时没有写文件权限,或者提示词里的输出路径不对。
修法:检查00-系统说明/文件夹是否存在,Codex 不会自动创建不存在的目录。手动mkdir -p ~/my-knowledge-base/00-系统说明。然后确认提示词里的保存路径和脚本里的OUTPUT_FILE一致。
这几个错误覆盖了 90% 的配置问题。遇到其他报错,先把日志tail -50看一下,Codex 的报错信息通常比较明确,照着改就行。
6. 把 MOC 接入日常工作流:从手动整理到自动仪表盘
配置跑通之后,MOC 就不只是一份目录了,它变成了你知识库的仪表盘。我现在的用法是每天早上打开 Obsidian,先看知识库目录.md顶部的「最近更新」板块,快速回到昨天的工作状态;再看「高频引用主题」,判断自己最近的精力花在哪个方向;最后扫一眼「孤立笔记」,挑一两篇补上双链或者归档。
这套工作流的关键是让 Codex 做重复劳动,你做判断。扫描文件、统计引用、生成列表这些事,人做一次两次还行,天天做肯定烦。Codex 每天凌晨自动跑一遍,你早上直接看结果。
如果你想让 MOC 更有用,可以再加两个板块。一个是「待办聚合」,让 Codex 扫描所有笔记里的- [ ]未完成项,汇总到 MOC 末尾。另一个是「标签统计」,统计每个 tag 下有多少篇笔记,帮你发现标签体系是不是太散。
提示词加一段就行:
7. 扫描所有笔记里的未完成待办(- [ ] 开头),汇总到「待办聚合」板块 8. 统计所有 tag 的使用次数,按次数倒序排列到「标签统计」板块改完提示词,下次 cron 跑的时候就会带上这两个板块。
关于 TaoToken 的接入,如果你后面想换模型,不用改脚本,只改config.toml里的model字段就行。比如从gpt-5-codex换成别的模型 ID,脚本完全不用动。这就是统一 Key 的好处:配置和业务逻辑解耦。
最后说一个我踩过的坑。刚开始我把 cron 设成每小时跑一次,结果 Codex 频繁调用,日志文件涨得飞快,而且生成的 MOC 内容几乎没变化。后来改成每天凌晨 2 点跑一次,足够了。知识库的目录结构不会每小时都变,没必要那么频繁。如果你笔记更新特别频繁,改成每天早晚各一次也行,但别更密了。
脚本和提示词都在上面,复制过去改改路径就能用。先把手动流程跑通,确认生成的 MOC 是你想要的格式,再配 cron。别一上来就自动化,不然每天生成一份你不看的目录,纯属浪费。