disktree 终极指南:Rust + GPUI 打造的磁盘占用 Treemap 可视化神器,快速定位空间黑洞
【免费下载链接】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 可视化工具:它扫描你的主目录(或任意目录),把每个文件夹画成一块按真实磁盘占用大小计算的马赛克拼块,让你一眼找出"空间黑洞",标记、审查并安全删除它们——整个过程中卷的剩余空间始终显示在侧边栏。
🎯 它解决什么问题
磁盘又满了,但不知道空间被谁吃掉?传统命令(如du)只给一堆数字,而 disktree 给你一幅"磁盘地图":
- 大小即面积:目录越占空间,色块越大,嵌套层级一眼可见
- 颜色即类型:代码、缓存、媒体、文档、工具链、Git 仓库等分类着色
- 斜线即机会:带对角线斜纹的区域是可回收空间(缓存、同步历史、构建产物等)
- 剩余空间实时可见:侧边栏显示当前剩余量、标记删除后的预估剩余量
一句话定位:像 du 一样精确,像图形界面一样直观,还能直接帮你删。
⚡ 快速安装
方式一:源码构建(推荐)
git clone https://gitcode.com/gh_mirrors/di/disktree cd disktree make installMakefile 中的make install会构建 release 二进制,并安装三样东西(无需 root):
| 安装产物 | 位置 |
|---|---|
disktree可执行文件 | ~/.local/bin/disktree |
| 桌面入口(启动器 + 文件管理器"打开方式") | ~/.local/share/applications |
| 图标 | ~/.local/share/icons |
需要Rust 1.97+,以及 Wayland/X11 会话中一块 GPUI 可驱动的 GPU(Vulkan)。发行版自带的 Rust 若太旧,可用 rustup 安装新版。
方式二:直接下载发布包
- Linux:下载
disktree-*-x86_64-linux.tar.gz(ARM 为aarch64-linux),解压后运行install.sh,或直接把disktree拷入PATH - macOS:下载 zip,把
disktree.app拖入应用程序;建议授予"完全磁盘访问权限",否则邮件、Safari 数据等会被算作"不可读" - Windows:下载 zip 解压后直接运行
disktree.exe即可
系统级安装可用sudo make install PREFIX=/usr/local,卸载用make uninstall。
🗺️ 界面解读:三秒看懂马赛克
(上图为项目自带截图,展示 881 GiB 主目录的扫描结果)
界面分为四个区域:
- 顶部路径栏:从
/开始的面包屑,以及测量模式切换——Size(大小)/Files(文件数)/Age(最后写入时间),还有"隐藏文件""显示大小""绘制深度"等开关 - 扫描统计行:扫描总量、过滤器、图例(各颜色对应哪类数据)
- 马赛克主体:
- 颜色代表数据种类:代码、AI 代理工作区、工具链、同步文件、Git、媒体、文档、缓存
- Age 模式下颜色改为按最后写入时间从"本周"到"更旧"渐变
- 顶层目录带彩色色条和名称标签,越深层级颜色越浅
- 右侧面板:当前选中项的详情(大小、占比、文件数、Git 状态)、**"值得看看"**推荐列表(最可能可清理的大项)、已标记清单,以及磁盘剩余空间的实时投影
琥珀色被单独保留:它只用于"当前选择"和"可回收空间"这两个关键信号。
🏷️ 标记与删除:三步清理空间黑洞
这是 disktree 最贴心的设计——标记绝不破坏任何东西:
- 标记:把鼠标悬停在色块上按
space(或x),被标记的块及其内容变为警示色 - 审查:按
c打开标记列表,可逐项取消标记 - 执行,两种模式:
- 移入回收站(默认):可恢复,直接执行。Linux 下自动选择
trash-put→gio trash→ 内置 XDG 回收站 - 永久删除:
rm -rf级别的删除,永远会先弹窗确认,明确列出删什么、能腾出多少空间
- 移入回收站(默认):可恢复,直接执行。Linux 下自动选择
删除完成后,disktree 会自动重新扫描,让屏幕上的数字与磁盘真实状态一致,并显示实际腾出的空间量。
这些数字不靠估算:应用会在删除前后各测一次卷的实际容量,实现逻辑在 crates/disktree-core/src/space.rs。
🔒 它坚决不做的事
删除保护规则位于 crates/disktree-core/src/removal.rs,且每条都有测试覆盖:
- ❌ 拒绝删除文件系统根目录、扫描根目录、你的主目录
- ❌ 拒绝删除挂载点(含内部带挂载点的目录)
- ❌ 系统目录(
/usr、/etc、/boot、/var/lib、Nix Store、Homebrew 前缀)一律拒绝——"包管理器才是管家" - ❌ 符号链接只断开链接,绝不跟随
- ❌ 不经过 shell 传参,名为
-rf的文件也只是一个普通文件
⌨️ 核心快捷键
| 按键 | 作用 |
|---|---|
space/x | 标记 / 取消标记色块 |
enter | 进入该目录(任意深度) |
⌫/esc | 上一级目录 |
alt ←alt → | 浏览历史前进 / 后退 |
| 滚轮 | 向指针处放大,继续滚动即"钻入"目录 |
/ | 按名称过滤:只有匹配的块保留颜色,enter仅显示它们 |
c | 打开标记审查列表 |
t | 按大小 / 文件数切换排序 |
g | 扫描整个磁盘 |
r | 重新扫描 |
? | 查看全部快捷键 |
📏 它量的是什么?(和du一致)
- 默认测量磁盘实际占用(
st_blocks × 512),即du报告的值,也是删除文件时真正能拿回的空间 - 硬链接只计一次:两个名字指向同一个 inode,只算一个文件
- 默认包含隐藏文件——因为
~/.cache往往是主目录里最大的东西 - 不跟随符号链接
- 扫描采用 dust 式并行策略(rayon 多进程),大目录也能秒级完成
扫描核心逻辑在 crates/disktree-core/src/scan.rs,Treemap 的矩形布局算法在 crates/disktree-core/src/treemap.rs。
扫描整个磁盘
点击路径栏的/、按g、或启动器里的"Scan the whole disk"。从~扩展到/时,已测量的部分会被记忆复用——只扫描主目录之外的内容,通常只需几秒钟而不是完整重扫。
📂 项目结构速览
代码分为"无 UI 的核心"和"GPUI 界面"两部分,边界清晰:
| 路径 | 职责 |
|---|---|
| crates/disktree-core/ | 扫描、树结构、矩形布局、剩余空间、删除——零 UI 依赖 |
| crates/disktree-core/src/classify.rs | 目录分类规则(颜色从哪来) |
| crates/disktree-core/src/insights.rs | "值得看看"推荐:可回收空间、AI 代理工作区、30 天未动的实验目录 |
| crates/disktree-app/src/state.rs | 全部交互动作与键位映射 |
| crates/disktree-app/src/views.rs | 各界面 |
| crates/disktree-app/src/treemap_view.rs | 马赛克绘制与标签 |
| crates/disktree-app/src/tests.rs | 端到端测试:真实窗口、真实按键 |
| packaging/ | 桌面入口、图标、安装脚本 |
| AGENTS.md | 开发约定与不变量清单 |
💡 上手建议
- 先跑一次
disktree(默认扫描主目录),用侧边栏"Worth a look"列表快速锁定候选 - 按
t切换"按文件数"模式,往往能发现文件碎、占用小的隐形大户 - 标记后先
s把清单导出为文本文件存底,再执行删除 - 在 Hyprland 等平铺窗口管理器中,建议给窗口类
disktree配置浮动和更大尺寸——它需要一块宽敞的画布
disktree 证明了一件事:磁盘清理不必在"命令行精确但抽象"和"图形界面直观但危险"之间二选一。MIT 协议开源,Rust 编写、严格 lint 门禁(Cargo.toml 中clippy::pedantic全量作为错误),删除保护条条有测试。下次磁盘告急时,让它先给你看一张地图。
【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust + GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考