怎么删掉 Claude Code 的旧会话
按时间删,一条 find 就够了,cleanupPeriodDays 还能定时替你删——但填满磁盘的,很少是旧会话
Claude Code 没有归档。什么都不会被挪到一边,也没有回收站,更没有可以修剪的保留视图:claude --resume 里的列表是每次读 ~/.claude/projects 现生成的,所以一次会话从列表里消失,就是那个文件从磁盘上消失。因此“把归档的会话删掉”只可能是两种意思之一——删掉早于某个日期的,或者删掉体积大的。
按时间删
一条命令。建议先不带 -delete 跑一遍,看看它会动哪些文件。
# 会删哪些:所有最后写入时间超过 30 天的会话记录
find ~/.claude/projects -name '*.jsonl' -mtime +30
# 一共多大
find ~/.claude/projects -name '*.jsonl' -mtime +30 -exec du -ch {} + | tail -1
# 真删
find ~/.claude/projects -name '*.jsonl' -mtime +30 -delete
-mtime 看的是最后一次写入,而不是开始时间,所以上周刚恢复过的会话,不管第一行是多久以前写的,都算上周的。如果设置了 CLAUDE_CONFIG_DIR,路径也跟着变。
如果想整个项目一起删,而不是只删旧会话,claude project purge(Claude Code 2.1.126 及以后)会把该项目的所有会话记录连同它的记忆目录和文件编辑历史一起删掉;--dry-run 会先列出来。只删一次会话的情况见会话文件怎么删。
让 Claude Code 自己删
同样的清理也可以是一个设置。~/.claude/settings.json 里的 cleanupPeriodDays 是保留天数,不设就是 30,超过这个天数的会话记录会自动删除。
{ "cleanupPeriodDays": 90 }
调大就保留得更久;调小就是按时间定时清理。这个设置只管 ~/.claude/projects——你的提示词历史 ~/.claude/history.jsonl 是另一个文件,不受影响。
按时间删,腾不出多少空间
在一台机器上实测,21 个项目目录下共 1,320 份会话记录:
全部会话 1,320 个文件 2.73 GB 超过 30 天 368 个文件 0.11 GB (占 4% 的字节) 最大的十个文件 10 个文件 2.36 GB (占 86% 的字节) 最大的那一个 1 个文件 1.01 GB
百分之二十八的文件超过一个月,却只占百分之四的空间。会话的大小取决于工具往里打印了多少内容,而不是它是多久以前跑的,所以一个下午的构建循环,就能比一整年的日常工作还大。如果目的是腾出空间,就按大小排序,删掉最大的几个。如果目的是不再让旧的工作留在磁盘上,那按时间才是对的,上面那条 find 就是全部。
# 最大的十个,单位 MB,从大到小
find ~/.claude/projects -name '*.jsonl' -exec du -m {} + | sort -rn | head
ls -S 看起来是更短的写法,但用在这里是错的:-exec … + 是一批一批把文件交给命令的,每一批各自排序,前十行只是第一批里最大的。排序放在 exec 之后,顺序才是全局的。
你会失去什么
删掉的会话记录会立刻从 claude --resume 里消失,智能体本身不会出任何问题。随之而去的是那份记录:那次会话里你试过什么,最后终于跑通的那条命令,某个决定为什么那样做。这些没法从代码仓库里找回,因为大部分内容从来没有提交过——清理之前做的备份快照,就成了唯一的副本。会话已经删掉之后还能找回什么,见找回被删掉的会话。
在文件还在时建好的索引,在文件被删之后仍然能回答,这是清理之后唯一按设计保留下来的副本。deja 就是这样的东西:它把会话记录读一遍,在 ~/.cache/deja 下保存自己的索引,并从索引里回答——所以你可以放心跑上面的 find,而不会丢掉那些会话里的内容。在直接运行 deja 打开的界面里,被清掉的会话列在“已删除”标签页下,按 R 会把其中一个写回去,让 claude --resume 重新找到它,带回的是对话,不包括工具调用。