1. 项目缘起:为什么我会想做一个“原始人”方案
如果你最近也跟我一样,被各种“All-in-One”笔记软件、知识库工具折腾得头大——功能越做越重,启动越来越慢,同步越来越玄学,格式越来越封闭,那你大概率能理解我第一次听说caveman这个词作为项目名时的会心一笑。把个人知识管理做得像山顶洞人一样原始?是的,这个项目要的就是这种近乎“赤裸”的纯净感。
caveman不是什么新框架,也不是什么云原生工具链,它的核心描述可以浓缩成一句话:一套只依赖纯文本、标准命令行工具和简单脚本的个人工作流与信息管理系统。你可以把它理解成一个极简版的“数字岩洞”——所有信息都以最原始、最透明的 .txt / .md 文件形式躺在你的硬盘上,没有专有数据库,没有云锁定,没有任何你不可见的黑盒逻辑。
我自己是被“笔记软件搬家”折磨过两轮的人,深知那种数据被困在某个无人维护的 App 里的无力感。所以当看到caveman这个项目思路时,第一反应就是:这才是把掌控感还给用户的东西。这项目特别适合三类人:一是对知识管理工具选型有选择困难、想要彻底“减负”的人;二是习惯在终端里干活、相信“文件即数据”的工程师;三是对隐私和数据长期可访问性有执念的数字囤积者。
整个方案不要求你有多高深的技术水平,只要会用终端敲几十个命令、愿意维护几条简单的命名规范,就能把属于自己的“洞窟”建起来。下面我就把这个项目从设计思路到落地全程拆开,逐个环节讲清楚。
2. 整体设计与核心思路拆解
2.1 为什么非要退回“原始时代”
现在市面上几乎没有哪款笔记工具敢把“原始”当成卖点,恰恰因为caveman选择了“返祖”,它才有了一堆现代工具给不了的好处。
- 零锁定风险:所有内容都是纯文本文件,任何系统、任何文本编辑器、哪怕一个 20 年前的老终端都能打开。不需要担心软件停运、云服务关停、数据库损坏导致十年笔记一夜蒸发。
- 极低心智负担:没有嵌套层级、没有标签云、没有复杂的双链图,目录就是分类,文件名就是索引,一切所见即所得。打开一个文件夹,你立刻知道这条知识在哪里。
- 配合顺手:纯文本天生适合 Git 做版本管理,天然兼容 grep、rg、find 这些 Unix 经典工具,配合 shell 脚本能实现任何你想得到的自动化操作。
这里回答一个几乎每个朋友都会问的问题:“那我直接用记事本不就行了?”其实差很远。裸的记事本没有组织规范,没有索引逻辑,信息一旦多了就变成一锅粥。而caveman提供的不是工具本身,而是一套带规范的方案——它规定了你如何命名、如何记录、如何归档、如何检索,这层薄薄的约定才是“原始”和“混乱”的分界线。
2.2 方案选型背后的取舍逻辑
在设计这个方案时,我做过三次明显的取舍,每次都踩住了一条原则:凡是能被明文解决的功能,绝不用二进制格式;凡是能靠命名解决的问题,绝不上数据库。
取舍之一:文件格式用 Markdown 而不是富文本。Markdown 本质是带极轻标记的纯文本,加粗、列表、链接都能轻松表达,同时打开后就是可读的源代码。富文本看着花哨,可一旦混排复杂样式,底层 XML 冗长到想哭。Markdown 的渲染可交给 Typora、VS Code、Obsidian 等任选工具,但数据本身永远是干净清爽的。
取舍之二:分类用“文件夹 + 文件名前缀”而不是数据库标签。标签系统在信息量小的时候很好用,一旦标签数量膨胀,维护成本比收益还大。而caveman用固定命名规则(如20250101-跑步随想.md)天然支撑时间轴排序、主题前缀筛选,比标签系统更直观也更抗遗忘。
取舍之三:同步用 Git 而不是网盘。网盘同步会制造大量冲突副本,而且对纯文本的版本回溯能力极差。Git 是所有开发者都熟悉的版本工具,caveman借助 Git 可以做到:每次改动都有历史记录,每个阶段都能标注 commit message,随时 diff 查看改了什么,再也不会出现“这个笔记到底是哪版本”的错乱。
2.3 已实现的功能清单
| 功能模块 | 实现方式 | 解决的问题 |
|---|---|---|
| 快速记录 | 终端命令caveman new <标题>,自动生成带日期和模板的新文件 | 降低记录的启动摩擦 |
| 全文检索 | 直接使用 rg / grep 递归搜索,毫秒级返回 | 信息查找不求人 |
| 版本回溯 | 每次记录后自动 git commit,支持逐版查看 | 防止误删和写坏 |
| 分类聚合 | 按文件夹 + 文件名日期前缀,脚本一键汇总周报/月报 | 告别手工复制粘贴 |
| 轻量加密 | 针对特定敏感文件用 gpg 单独加密,并不影响整体明文 | 隐私保护有兜底 |
| 多端可用 | 任意支持 Git 的设备均可克隆仓库继续使用 | 跨设备不再是噩梦 |
这套体系没有“太多功能”,每个功能都是我在使用中真实需要的,没有一个是赶时髦堆上去的。这也是caveman的初衷——功能只保留能站稳的,多余的一律砍掉。
3. 核心细节解析与实操要点
3.1 目录结构与命名规范的设计心法
整个caveman的骨架其实非常朴素,下面是我实际采用的目录结构,你可以直接照抄:
~/cave/ ├── 00-inbox/ # 临时收件箱,所有想法先丢进来 ├── 10-projects/ # 按项目归档,每个项目一个子目录 ├── 20-areas/ # 长期关注的领域(健康、理财、阅读等) ├── 30-archives/ # 完成、沉淀、不再频繁变动的文件 └── 99-templates/ # 各类文件模板这个结构借鉴了 PARA 方法的精髓,但做了极简化:不设“资源”文件夹,因为很多东西介于资源和项目之间,硬分类会带来选择困难;收件箱只有 1 个,给所有临时信息一个不用纠结的落脚点;归档区明确,让认知负荷显著下降。归档符号化之后,我每次新建文件只需问一个问题:这是临时还是长期?临时进00-inbox,长期再考虑去哪个编号目录。
文件命名我统一采用YYYYMMDD-主题关键词.md。日期放前面不光是排序需要,更重要的是能提醒自己信息的时效性。前缀编号(00/10/20/30/99)看似随意,实际留足了扩充空间——比如以后想加一个 15-research 分类,完全不需要打断现有的十位分法。
3.2 模板与元信息设计
每个新建文件都从模板生成。拿一篇日志模板举例,内容极短但信息字段齐全:
--- title: date: 2025-01-01 type: log tags: [] --- ## 今天做了什么 ## 有什么想法 ## 明日待办YAML 头(frontmatter)里只放了三个必要字段:标题、日期、类型。标签字段保留但我不强求,有就填,没有就空着。这里有个我在实操中总结出的经验:元信息最多五条,超过这个数字你很快就会懒得填,最后模板形同虚设。模板存在的意义是降低记录时的思考负担,而不是给你增加负担。
模板文件放在99-templates目录,用 shell 脚本复制出来并替换变量。后面第 4 节我会把脚本完整写出来,到时你一看就懂。
3.3 轻量加密实现的注意点
整套方案主推“明文主义”,但有些特殊文件(比如银行卡账单、个人私钥备份)不适合直接放在文件夹里。我用gpg对特定隐私文件做对称加密,所有.md.gpg后缀的文件可以直接丢在原来的目录里,不会被误读也不会影响其他文件的检索。
注意:加密文件一定要记得保存好密码短语,
gpg一旦丢密码,神仙也救不回来。我见过不止一个人加密一时爽、解密火葬场。
我更强调一点:加密仅限极少数文件,如果发现加密文件数量超过总文件的 2%,就要反思是否把太多东西默认成了“敏感内容”,加密范围一旦扩大,管理成本会指数级上升。
4. 实操过程与核心环节实现
4.1 环境准备:先从干净开始
要跑起caveman,你需要的东西异常普通:一台 mac/Linux 电脑(Windows 下用 WSL 也能跑),装了基础的git、rg(ripgrep,可选但强烈推荐)、gpg(需要加密时才用)。所有工具终端自然自带或包管理器一行安装。
创建目录骨架并初始化 Git 仓库,这一步直接决定了你的“洞府”根基:
mkdir -p ~/cave/{00-inbox,10-projects,20-areas,30-archives,99-templates} cd ~/cave git init git commit --allow-empty -m "caveman 项目启动,洞窟初立"执行完你可以看一眼~/cave下的目录,干干净净,没有任何多余信息。从这一步开始,这个文件夹就是你的数字世界中心了。
4.2 核心脚本:new、search、archive 三兄弟
光有目录还不够,caveman的灵魂在于几个顺手得离谱的脚本。我把它们放在~/bin下,用最简单直白的 Bash 编写,不求炫技,只求看代码的人一秒读懂。
先看new,它的作用是纳新,把记录的摩擦降低到“一条命令”:
#!/bin/bash # 用法: caveman new "跑步随想" TITLE="$*" DATE=$(date +%Y%m%d) CLEAN_TITLE=$(echo "$TITLE" | tr ' ' '-') FILE="$HOME/cave/00-inbox/${DATE}-${CLEAN_TITLE}.md" cp "$HOME/cave/99-templates/log.md" "$FILE" sed -i '' "s/^date: .*/date: $(date +%Y-%m-%d)/" "$FILE" 2>/dev/null || \ sed -i "s/^date: .*/date: $(date +%Y-%m-%d)/" "$FILE" sed -i '' "s/^title: .*/title: ${TITLE}/" "$FILE" 2>/dev/null || \ sed -i "s/^title: .*/title: ${TITLE}/" "$FILE" echo "文件已创建: $FILE"命令细节说明:先用date生成格式化时间戳,再把标题中的空格替换成连字符,避免文件名里出现难处理的空字符。复制模板后用sed替换掉 title 和 date 两行——macOS 的 BSD sed 和 Linux 的 GNU sed 语法稍有差异,我就用||给两个系统做了兼容,实测都能跑。输出文件路径这点很重要,能减少“我建的文件去哪了”的困惑。
再写search,它的作用是查老信息,借助 ripgrep 实现毫秒级实时搜索:
#!/bin/bash # 用法: caveman search "关键词" rg -n --color=always "$1" "$HOME/cave" --glob '!99-templates/**'别小看这一行命令,它比绝大多数图形软件内置的搜索都快且准。配合--glob排除模板文件,搜索结果不会混入干扰项,干净漂亮。
第三个脚本archive,作用是归档与盘点,让信息生命周期闭环:
#!/bin/bash # 用法: caveman archive <inbox文件名> INBOX_FILE="$1" [ -z "$INBOX_FILE" ] && echo "请指定要归档的文件名" && exit 1 read -p "归档到哪个分类?(projects/areas) " DEST mkdir -p "$HOME/cave/10-${DEST}" mv "$HOME/cave/00-inbox/${INBOX_FILE}" "$HOME/cave/10-${DEST}/"为什么归档只给两个选项?这是我从实际使用中抠出来的简化。过去我设置过五个目录让用户选,结果每次归档都在纠结;缩成 projects/areas 两类之后,决策路径短了,归档率肉眼可见地提升了。别小看这个细节,选择越少,系统越能被坚持用下去。
4.3 自动提交与 Git 钩子
new给了记录入口,但版本控制不能全靠手动git commit——那样你一定会偶尔偷懒,一偷懒历史就断档。我的方案是写一个简单的自动提交脚本,并放在任务计划里每 15 分钟跑一次:
#!/bin/bash cd "$HOME/cave" if [[ -n $(git status --porcelain) ]]; then git add -A git commit -m "自动备份 $(date +'%Y-%m-%d %H:%M')" >/dev/null 2>&1 fi思路很直白:先用git status --porcelain检查是否有变更,没有就静默退出,有就全部提交。提交信息带上具体时间,方便日后查阅。这样即使我某天随手写了两行想法忘提交,最多 15 分钟后 Git 也会自动把状态保存得妥妥帖帖。用 Git 做自动快照有一个巨大的好处,就是任何一次作死修改都能无痛回滚,写错的内容不会从历史里消失,只会从当版里消失。
4.4 让脚本全局可用
脚本写好后,别忘记给执行权限并放进 PATH:
chmod +x ~/bin/caveman-new ~/bin/caveman-search ~/bin/caveman-archive # 如果你把脚本名定义成 caveman-*,可以再做一个软链 ln -s ~/bin/caveman-new /usr/local/bin/cave-new # 可选实际使用中我更建议直接把脚本当成一组以cave开头的小工具,凑成一套完整工具箱,而不是硬塞进单个命令的“玛璐德”。如果你在 zsh 里开了补全,命令敲到一半就能看到所有候选,体验相当顺滑。
5. 常见问题与排查技巧实录
5.1 文件多了找不到怎么办
刚开始用caveman时我一度膨胀到往收件箱里堆了 100 多个文件,结果收件箱变成了垃圾回收站。后来我强制给自己加了一条规则:任何进入收件箱的文件,24 小时内必须归档或删除。归档的准则是:有长期价值就移入20-areas,跟具体交付相关就移入10-projects,连自己都不知道留着干嘛的,一律删掉。
即便归档做得再好,偶尔还是会在找资料时大脑短路。这时候别硬用rg了,我常用的救援组合是:
# 模糊查找:只记得大概主题词 find ~/cave -name "*跑步*" # 内容查找:只记得某句话 rg -l "心律" ~/cave # 高频查看:找出最近两周改过的所有文件 find ~/cave -name "*.md" -mtime -14这三个命令覆盖了“记不住名字”“记不住路径”“记不住时间”三种经典记忆模糊场景,基本能做到十秒内定位。这里特别强调rg -l的-l参数,只打印文件名而不打印匹配内容,在资料多的时候输出体验会清爽好几倍。
5.2 跨设备同步的冲突处理
Git 做同步很棒,最烦人的场景是两台设备同时改了一个文件。我踩过这个坑,经验如下:
先看冲突长什么样:Git 会把<<<<<<<、=======、>>>>>>>这三段标记直接写进文件里。处理冲突的方法,靠的不是什么高深技术,而是冷静三步走:
- 打开冲突文件,先看
=======上下两段各自写了什么 - 结合
git log --oneline -5看最近改动背景,判断哪版才是真正的新内容 - 手动删除冲突标记,保留正确内容,再
git add+git commit
注意:如果你发现某个文件反复成为冲突焦点,几乎可以断定是这台设备上用了旧版本覆盖新版本。最好的规避方式是在切设备前先
git pull一遍,不要凭“记得上次已经同步过了”的风险直觉操作。
5.3 我差点放弃的几个瞬间
从项目启动到今天稳定使用,中间确实有差点放弃的阶段。分享一下当时最想弃坑的瞬间,以及最后是怎么走出来的。
最想弃坑的时候是第三周,当时新建文件、归档、搜索这套流程已经跑熟,但发现每周写回顾总结时,我还要一份份翻各个分类的文件,人工汇总超累。那时我一度想引入数据库、想上一个本地 Wiki,差点让方案从极简走向复杂。
后来我换了个思路:既然有 git,为什么不借 git log 生成周报基础数据?我写了个每周回顾脚本,把所有20-areas下的本周新建/修改文件列出,按文件名排序输出。这么一来,回顾时我只需要对着清单看一遍,回忆成本大幅下降。所以我的心得是:工具“原始”不代表不能自动化,恰恰是因为数据和命令足够原始,自动化反而变得无比容易。
另一个想弃坑的瞬间是某次误操作,把整个~/cave目录删了。当时大脑一片空白,幸好 Git 自动提交救了我——一分钟后我已经通过git reset --hard HEAD~0把仓库完整恢复。当时特别庆幸自己坚持了自动化提交,否则几年的知识资产就真的变成了“一顿操作猛如虎,回到解放前”。
5.4 更多避坑心得
- 别在文件名里用中文空格和特殊符号:虽然 mac/Linux 都支持,但跨设备同步、url 化、搜索时容易出幺蛾子。个人经验是用“-”连接,干净利落。
- 模板不要加无意义的大段示例:模板是激励你自己写的,不是展示“格式精美的样板书”。留核心骨架,其他都是干扰。
- 定期做全量备份:Git 仓库虽然保留历史,但如果你把整个目录拷贝到 U 盘时忽略了
.git文件夹,那版本历史就没带走。我一般每月做一次tar -czf cave.tar.gz ~/cave,存到另一个物理硬碟上。 - GPG 加密不要成为日常习惯:日常默认明文;加密只做特殊章节的隐私保护。一旦你养成了“什么都加密”的情绪,检索效率会断崖式下跌。
6. 扩展方向:如何把“洞窟”变成根据地
caveman项目想走得更远,可以像给岩洞接水电一样陆续添加配置。下面列的是我给自己的扩展路线图,你完全可以根据实际需要选做。
- Quick Capture 集成:手机端不便打开电脑快速记录时,我临时用一个共享收件目录,把随手拍的照片、灵感语音通过自带“文件传输”功能丢进
00-inbox,回来后统一整理。这功能无需写代码,一个 SFTP 或者 WebDAV 挂载即可完成。 - 周期报告自动化:用脚本直接生成“月报”摘要。grep 当月所有文件里的关键标题,按领域分组输出 Markdown 报告。以前觉得这种操作得写几百行代码,实际上用
awk和循环就能做得很像样。 - 索引文件自动生成:在
~/cave/下维护一个README.md,每次归档时自动把目录编号和分类说明更新到里面,新加入的设备或协作者一目了然看懂全貌。 - 与前端的轻量联动:如果你懂一点 Node/Python,可写一个极简本地服务,把
~/cave当作数据源渲染成网页,实现手机浏览器阅读和检索。这层是可选的,因为caveman的核心永远是底层文件系统,上层表现随时可换。
我个人目前最想做的后续动作是把它和定时任务深度整合:每周日晚自动统计本周新增内容、显示未归档数量,并提醒我完成归档与回顾。这样整个系统才真正像一个有生命的“洞窟”,不断积累、清点、沉淀,而不是静静地躺在硬盘某个角落吃灰。
7. 写在最后的一点私人体会
做caveman这个项目,最打动我的不是它比某些大厂软件多了什么功能,恰恰是它少了很多东西。它不催我交月费,不推荐我升级套餐,不在我写作时弹窗广告,更不会在我笔记数量达到一万条时倒逼我要么接受付费、要么忍受卡顿。
我现在每天打开终端的频率远高于打开任何笔记软件,这种“返祖体验”反而让我觉得掌控感极强——我的每一条想法都落在一个可见、可控、可移动的普通文件里,这种感觉像是自己重新做回了数字世界的主人。如果你也对那些越来越重的知识工具感到疲惫,不妨找一个下午,照着上面的步骤搭建一个属于自己的caveman,那种简洁带来的踏实感,试过才知道。