☰
disktree 全盘扫描实战:为什么从家目录扩展到整个磁盘只需要几秒
2026/9/28 21:02:45 网站建设 项目流程

disktree 全盘扫描实战:为什么从家目录扩展到整个磁盘只需要几秒

【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust + GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree

disktree 是一款用 Rust + GPUI 构建的磁盘空间树状图(treemap)工具:它把目录画成按真实磁盘占用大小排列的嵌套马赛克,帮你找出磁盘被什么占满、标记该删的内容并安全清理。本文以一次真实的"全盘扫描"为例,讲解 disktree 从家目录扩展到整个磁盘时,为什么只需几秒就能完成,而不是重新扫一遍全盘。

先看一眼效果:磁盘占用一张图看懂 🖼️

界面上有几个关键区域(详见 README.md):

  • 顶部面包屑:从/开始的完整路径。被扫根目录上方的条目是"变暗"的,点击它就能把扫描范围扩大到那里;
  • 中央马赛克:颜色代表数据类型(代码、缓存、媒体、Git、文档等),斜纹表示可回收空间;
  • 右侧面板:当前选中的大小与占比、"值得看一眼"的清理建议、磁盘当前空闲量以及标记后的预计空闲量。

开启全盘扫描的 3 种方式 ⚡

从家目录出发,想让 disktree 看到整个磁盘,任选其一即可:

  1. 按g键:直接跳转到家目录所在的磁盘根(Omarchy 和 macOS 上就是/);
  2. 点击面包屑:点击被扫根目录上方变暗的任一条目,扫描范围会逐级扩大到那里;
  3. 命令行启动:运行disktree --disk,启动即扫描家目录所在的整块磁盘;也可以直接disktree ~/src指定任意目录。

💡 扩展完成后的新视图会自动定位到你出发的那个目录,回退到小范围则只是普通的目录导航,随时可来回切换。

为什么扩展扫描只需要几秒?

很多人预期"从~扩到/"意味着重新扫描 390 万个文件(截图底部可以看到:scan 3.9M entries · 1.0 s)。实际上扩展扫描只读取~之外的部分,原因有三:

1. 记忆化复用:已测过的子树直接"搬运"

这是最关键的一步。扩展扫描时,disktree 把已经测量好的树作为一个Known结构(路径 + 共享的树节点)交给新的遍历任务。当新扫描走到家目录时,直接复用旧树,不再逐文件读取:

  • 复用逻辑在 scan.rs:Known注释写得很直白——"widening from~to/only reads what is outside~";
  • 触发入口在 state.rs 的widen_to:它克隆当前树、生成Known,再调用ScanHandle::spawn_with启动只扫增量部分的扫描;
  • 端到端测试 widening_reuses_the_tree_it_has_and_reads_only_the_rest 专门验证了这一点:子树被复用而非重走,范围外的目录被真实扫描,且视图自动选回"来路"。

2. 并行扫描是底子

即便要扫的新区域也很大,disktree 的扫描器本身也是并行的(沿用了 dust 的思路,见 scan.rs 文件头注释):每个目录带原子完成计数器,只有当自身和所有子目录任务都结束后目录才构建,最后一次性自底向上汇总大小并去重硬链接。多核并行意味着"剩下的部分"通常也就是秒级。

3. "整个磁盘"的范围被精确圈定

扩展扫描只停留在家目录所在的那个卷(按挂载源判定,而非设备号)。这带来两个好处:

  • 自动跳过/proc、/sys、/run、tmpfs、/boot、其他磁盘、网络共享和自动挂载点(按路径检查,绝不会为了测量而挂载一块 NAS);
  • btrfs 快照子卷也会被排除——它们的文件与在线文件共享块,计入就会把磁盘算两遍。

所以"全盘"其实是"这一块数据卷的全部可读内容",范围可控、结果可信。

扫描过程中的几个体感细节 ✅

  • 旧视图不闪烁:扩展扫描进行时,当前视图一直留在屏幕上,直到更大的树落地才切换,全程无空白;
  • 无权限目录不瞎猜:没有 root 时读不了的目录会被计入顶栏的"不可读"统计,而不是估算一个数字;
  • 硬链接只算一次:两个名字指向同一个 inode,只计一个文件的量,所以"删掉它"能省出的空间是真实的;
  • 删错有保护:标记删除走审查流程,默认进回收站,永久删除永远先询问,且系统目录(/usr、/etc、/var/lib等)会被直接拒绝,详见 removal.rs。

相关源码索引

位置内容
crates/disktree-core/src/scan.rs并行扫描器、进度上报、Known子树复用
crates/disktree-app/src/state.rswiden_to扩展逻辑与g键行为
crates/disktree-app/src/views.rs面包屑渲染与"变暗条目扩大扫描"
crates/disktree-app/src/tests.rs扩展扫描复用子树的端到端测试
crates/disktree-core/src/removal.rs删除保护规则及测试

小结

disktree 的"全盘扫描"并不是一次推倒重来的全盘遍历:并行扫描器打底、记忆化复用让已测子树零成本并入、单卷圈定让范围精确可控——三者叠加,从家目录扩展到整个磁盘自然只需要几秒。对于"磁盘满了,到底被什么占了"这类问题,这种即时反馈正是树状图工具最值钱的地方。

【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust + GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询