资讯动态

disktree 实战指南:用 Rust + GPUI 树图透视磁盘占用,标记并安全回收空间

发布时间:2026/9/30 8:41:49 来源:尧图企业网站定制
【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust GPUI.项目地址https://gitcode.com/gh_mirrors/di/disktree点击查看免费下载disktree 是一个面向 Omarchy 桌面的磁盘占用可视化与清理工具它默认扫描你的主目录把每个目录画成按真实磁盘成本定尺寸的嵌套马赛克treemap并始终把卷的可用空间放在眼前。读完本文你将掌握 disktree 在 Linux、macOS、Windows 上的安装方式、完整命令行选项、键盘驱动的标记—审查—提交清理流程以及它背后如何度量、如何分类、如何拒绝删除的源码级设计原理。它是什么一张能走进的磁盘地图disktree 的核心交互可以用一句话概括找出是什么占满了磁盘标记应该删掉的东西然后移除它——整个过程中卷的可用空间始终可见。它由 GPUI通过 gpui-omarchy构建因此会跟随你的 Omarchy 主题表现得像桌面上的其他原生应用。它默认扫描主目录把每个目录画成嵌套的马赛克大小反映其在磁盘上的真实开销并支持用键盘或鼠标逐层进入。你可以随心所欲地标记在进入审查列表并确认提交之前什么都不会发生而永久删除路径总是会先征求确认。代码库按无 UI 的核心与GPUI 应用拆分为两个 cratecrates/disktree-core承担扫描、树结构、布局、空间核算与删除逻辑crates/disktree-app承载界面。正如 lib.rs 顶部注释所说明的这种拆分是为了让必须正确的部分——大小核算、硬链接去重、宽高比布局、以及什么可以被删除——能够在不依赖 GPUI、显示器或 GPU 的情况下独立构建和测试。安装Linux含 Omarchy从最新 release 下载disktree-*-x86_64-linux.tar.gzARM 机器选aarch64-linux解压后运行其中的./install.sh或者只把disktree复制到PATH上。也可以从源码构建git clone https://gitcode.com/gh_mirrors/di/disktree cd disktree make installmake install会构建 release 二进制并把三样东西放到~/.local下无需 root~/.local/bin/disktree一个 desktop entry让 disktree 出现在启动器里、也出现在文件管理器对目录的Open with菜单中它注册为处理器但永远不会成为默认程序一个图标sudo make install PREFIX/usr/local则安装到系统范围make uninstall只移除刚才安装的东西。Makefile 中的默认值定义在 MakefilePREFIX ? $(HOME)/.local、BINDIR ? $(PREFIX)/bin、桌面入口模板取自packaging/disktree.desktop.in图标取自assets/disktree.svg。Arch包括 Omarchy用户可以直接用 AURdisktree包从源码构建每个 releasedisktree-bin则安装 release 二进制yay -S disktree-bin运行前提需要 Rust 1.97 或更新版本以及 GPUI 能驱动Vulkan的 GPU 的 Wayland 或 X11 会话。发行版通常打包较旧的 Rust可用 rustup 安装最新版。仓库在rust-toolchain.toml中固定了 1.97因此使用 rustup 时即使rustup default指向更旧版本首次构建也会自动拉取正确的工具链。macOS下载disktree-*-aarch64-macos.zipIntel Mac 选x86_64-macos解压后把disktree.app拖入 Applications。需要 macOS 11 或更新版本。未签名、未公证的 release 会被 Gatekeeper 拦截macOS 会提示它已损坏无法打开或无法验证。应用本身没问题是浏览器给下载文件打了隔离标记。清除一次标记即可xattr -dr com.apple.quarantine /Applications/disktree.app或者先打开一次然后在 系统设置 › 隐私与安全性 里选择仍要打开。也可以自行构建需要 Rust 1.97 或更新版本以及 Xcode 或它的 Command Line Tools。macOS 不自带 Rust用 rustup 安装make install # ~/Applications/disktree.app以及 ~/.local/bin/disktree make uninstall注意 macOS 分支的 Makefile 逻辑与 Linux 不同它把disktree.app装入~/Applications可用APPS变量更改并在BINDIR里创建一个运行该应用二进制的disktree命令这样 Spotlight 和终端都能找到它。要看到全部内容请在 系统设置 › 隐私与安全性 中给 disktree 授予完全磁盘访问权限缺失时面板会提供按钮然后重新打开。没有该权限macOS 会隐藏邮件、信息、Safari、其他应用的数据和废纸篓disktree 会把它们计为不可读。如果从终端启动那么是终端本身需要该权限。macOS 还会分别询问一次桌面、文稿和下载。macOS 上与 Linux 的不同之处可用空间是df报告的数值。Finder 的数字更大它把可清除空间macOS 会自行清理的缓存和本地快照也算进去了。克隆文件APFS 在副本间共享块Finder 的复制副本就是这样各自被全额计数因此总量可能超过删除它们实际释放的空间。Time Machine 本地快照不是文件、不会出现它们属于扫描结果与磁盘已用空间之间的差额。云端专属文件夹iCloud Drive、Dropbox 等已驱逐到服务器的内容不会被打开因此扫描永远不会触发下载。要为他人签名并公证构建只要钥匙串里有 Developer ID 证书、并且已用xcrun notarytool store-credentials保存凭据NOTARY_PROFILEprofile cargo xtask bundle \ --sign Developer ID Application: Name (TEAMID) --notarizeWindows在 Windows 10 或 11 上从同一 release 下载disktree-*-x86_64-windows.zipARM 选aarch64-windows解压到任意位置后运行disktree.exe。或者用 Rust 1.97 或更新版本rustup MSVC 工具链Visual Studio Build Tools含 C 工作负载构建git clone https://gitcode.com/gh_mirrors/di/disktree cd disktree cargo build --release # target\release\disktree.exeWindows 下的行为差异见下文Windows 上的行为差异一节。顺带一提main.rs设置了#![windows_subsystem windows]main.rs因此从资源管理器或开始菜单打开时不会弹出控制台窗口而从终端启动时console::attach 会借用来时的父终端让--help和报错仍然能到达终端。基本使用disktree # 扫描主目录 disktree --disk # 扫描它所在的整个磁盘 disktree ~/src # 或任意目录 disktree --help # 选项表观大小、跟随链接、跳过隐藏项……命令行参数在 main.rs 中定义完整清单如下选项作用PATH要扫描的目录默认主目录-a,--apparent-size度量表观长度而非分配的块-l,--follow-links跟随符号链接-H,--no-hidden跳过点文件与点目录-D,--disk扫描主目录所在的整个磁盘-X,--cross-filesystems也度量 PATH 之下挂载的其他磁盘、网络共享与伪文件系统默认关闭-d,--depth N一次绘制多少层1–6默认 3--metric files按文件数而非字节数排序-h,--help显示帮助--disk与显式PATH不能同时给出--disk通过 space::volume_root_for 解析主目录所在卷的根。扫描选项的默认值来自 scan.rs 中ScanOptions::default()不度量表观大小、不跟随链接、包含隐藏项、单文件系统、去重硬链接、按字节排序。屏幕布局顶部从/开始的面包屑路径然后是度量维度——大小、文件数或时间、隐藏文件、表观大小以及当前绘制的深度。树中当前所在目录会变成面包屑其 ▾ 列出同级目录最大的在前附占比与大小可横向跳转箭头和回车同样有效。扫描根之上更高层级的面包屑会更暗点击它会把扫描范围扩大到那里见下文整个磁盘。其下扫描总量、输入过滤条件时的过滤器以及图例。马赛克颜色表示数据的种类——代码、Agent 临时文件、工具链、同步文件、git、媒体、文档、缓存——单一柔和的色阶越深越浅。对角线斜线阴影表示可以回收的空间缓存、同步历史、包仓库、构建产物与颜色无关。顶层目录带有自己的色条和名称带更深的打开目录有细小的标签行。在时间模式下颜色改为最近写入时间从本周到更早。面板当前选择项其大小放大显示、占扫描的份额、文件数、最近写入时间若是代码检出则显示 git 信息——改动、stash、未推送提交值得一看最可能可以删除的大件已标记项以及磁盘空间当前与标记之后的空闲空间以及通往审查屏幕的入口。拖动面板左边缘可调宽双击边缘复位。有一种颜色被刻意保留琥珀色标记选择项、主操作以及可以回收的东西。数据分类与可回收性判断的源码实现颜色的来源是目录名与少数形状裸 git 仓库、Cargo.toml旁的target具体规则见 classify.rs。其中定义了 8 种图例类别Category::LEGENDclassify.rsCode、Agent scratch、Toolchains、Synced、Git、Media、Documents、Cache另有兜底的Other。可回收性则由Reclaim枚举描述共 9 种理由Regenerable可再生缓存、SyncHistory、PackageStore、BuildOutput、Reinstallable、SandboxLayers、Snapshots、Trash、Temporary这些理由也正是Worth a look列表里显示的措辞。分类算法是自顶向下递归的一个节点自己的名字优先否则继承父级类别文件一律继承kind_of。可回收性同样向下继承因此缓存目录下的所有内容都会带斜线阴影classify_below。名字未知的顶层目录取它最大可识别子目录的类别例如~/world大部分是.git所以它是 Gitdominant_child_category。裸 git 仓库按形状识别一个目录同时含objects、refs、HEAD即视为 git 存储is_git_store无论它叫什么名字。单独一个名字太常见、不足以信任时会做兄弟检查target只有与Cargo.toml同目录才是 BuildOutputnode_modules只有与package.json同在才算 Reinstallablelayers/snapshots只有父级是 Agent scratch 才可回收reclaim_of。分类在性能上也有讲究目录名的小写化尽量在 32 字节的栈缓冲区里完成避免为数十万个目录每次分配字符串lowered并行化只发生在树的上层PARALLEL_LEVELS以内深层则逐个决定与下钻。仓库中还带有大量回归测试例如保证第二块盘上的 Steam 库按媒体而非其 temp 目录分类classify.rs、未知顶层目录取其最大已知子项、缓存可回收性一路向下等。标记Marking空格、X、回车和方向键在鼠标最后移动过时作用于鼠标下的瓦片在你用过方向键或 Tab 之后作用于键盘选中项。被标记的瓦片会变成危险色它内部的一切也如此删除一个目录会连同其内容一起删除。标记一个目录会吸收它内部已有的标记已标记目录内部的东西不能再单独标记或保留其面板会转而提供取消标记该目录。标记是可逆的——再按一次即可——而且节省的空间永远不会被重复计算。缩放与进入滚动朝指针方向放大滚轮会一直放大到指针下的目录填满视野下一格就进入其中——一个连续动作目录内容随之长出来。反方向滚动退出。Enter 在任意深度进入选中目录Backspace 或 Escape 上退一层。Size / Files / Age 开关旁边的和在访问过的目录间后退/前进alt ←alt →macOS 上还有⌘[⌘]和鼠标侧键同样有效。和-只放大不进入0复位。删除Removingc或Review…打开所有已标记项的列表。在那里取消任何标记然后选择移到回收站——有回收站可用时的默认项。macOS 上是系统废纸篓与 Finder 的移动相同在其他磁盘上则是那块磁盘自己的废纸篓网络共享通常没有。其他平台依次尝试trash-put来自 trash-cli、gio trash、内置的 XDG 回收站。在清空回收站之前可以恢复所以它直接提交。永久删除——rm -rf语义。它总是先询问弹窗会写明删除什么、能拿回多少空间。完成后disktree 会重新扫描让屏幕上的数字与磁盘一致并显示实际获得的可用空间。删除机制的源码级设计删除逻辑集中在 removal.rs注释明确了三件事按此优先级绝不删除用户没指过的东西、绝不跨入另一个文件系统、永远能说清发生了什么。两种模式RemovalMode::Permanent实现rm -rf --one-file-system语义但不调用 shell路径永远不会进入 shell、任何文件名都不会被误读为选项RemovalMode::Trash移入桌面回收站removal.rs。回收站后端检测macOS 永远用系统废纸篓经 NSFileManager与 Finder 同一动作Windows 永远用 Recycle Bin其他平台依次探测trash-put→gio trash→ 内置 XDG 实现detect_trash_backend。后端在 UI 中具名展示用户清楚实际会发生什么。调用外部工具时统一在路径前传--分隔符名为-rf的文件只会是文件run_tool并有测试验证 argv 顺序。执行前的计划plan所有标记路径先经过 plan扫描根之外、系统树、挂载点、主目录等一律进入blocked列表嵌套路径会被折叠为最外层目标被覆盖的内部路径单列covered供审查屏幕解释。挂载表缓存 2 秒刷新一次且读取绝不阻塞 UI 线程审查屏幕每帧都在规划。永久删除的落地方式Unix 上用rustix的openat/unlinkat逐级打开从扫描根到目标每一级都带O_NOFOLLOW——若某级在扫描后被替换成指向别处的符号链接删除会直接拒绝changed since the scan而不是跟随它open_parent。目录遍历中每个子目录都与顶层做设备/挂载 ID 比对跨文件系统立即停止remove_contents。Windows 分支则把目录链接junction按目录删除、只去掉链接本身。XDG 回收站内置实现写标准布局——文件移入Trash/files同时写入Trash/info/名.trashinfo记录百分号编码的原始路径与删除时间trash_into同名冲突自动追加.1、.2后缀。removal.rs 末尾附带大量测试计划只保留最外层目标、根与主目录被拒绝、挂载点被识别、符号链接只解除不跟随、Win32 会误读的名字Users.、NUL、COM1、file:stream等被拦截、XDG 回收站的移动与.trashinfo可恢复性、删除运行会逐项报告并汇总Done事件等。快捷键一览键作用space/x标记或取消标记指针所指的瓦片ctrl-clickmacOS 为⌘-click标记而不移动选择项enter在任意深度打开该目录⌫/esc上退一层目录alt ←alt →在访问历史中后退/前进←↑↓→在本层瓦片间移动tab下一个最大的同级滚动朝某目录放大然后进入它shift-滚动平移放大的视图[]一次少画/多画几层-0放大、缩小、复位视图ctrl ctrl -ctrl 0macOS 为⌘界面缩放/按名称过滤只有匹配项保留颜色enter只显示它们esc清除c审查已标记列表t按大小或文件数排序d磁盘用量或表观大小i包含或跳过隐藏项r重新扫描esc扫描中停止扫描v扫描另一个已挂载卷ctrl omacOS 为⌘O选择另一个目录扫描g整个磁盘p显示或隐藏选择行o在 Finder、文件资源管理器或文件管理器中显示它?列出所有键q退出macOS 上菜单栏还有 ⌘⇧R在 Finder 中显示选择项、⌘R重新扫描、⌘[ 与 ⌘]后退/前进以及 ⌘Q、⌘H、⌘W关闭窗口即退出其他 ⌘ 组合留给系统。Linux 和 Windows 上相同功能用 ctrl另外 F5 也可重新扫描。在审查屏幕上m移到回收站、p永久删除、!取消全部标记、enter提交、esc返回。也可以把列表交给别人处理s把它存为文本文件每行一个路径a复制一段给编码 Agent 的提示词按你挑选的内容释放空间逐个检查路径存在于别处、git 未保存的工作、工具自己的清理命令不碰其他任何东西。含换行符的名字会被排除在列表之外并在提示词中转义因此不可能被误当成另一条路径。它度量什么默认度量磁盘用量st_blocks × 512即du报告的数、也是删除文件后真正能拿回的空间。表观大小ls -l显示的值一键即可切换。硬链接只算一次。同一 inode 的两个名字只花一个文件的开销。隐藏项包含在内因为~/.cache常常是主目录里最大的东西。符号链接不被跟随。扫描遵循 dust 中实现每个根一个rayon::scope递归深度与树深无关恒为 O(1)每个目录一个原子完成计数器保证目录在其最后一个子目录到达前不会被构建最后一遍自底向上聚合大小并去重硬链接。在此之上又加了两点UI 可无锁轮询的实时进度计数ScanProgress纯 relaxed 原子操作以及协作式取消——重新扫描时可以放弃对大型主目录的遍历而不必排队等它。宽化扫描还能通过Known子树复用已测得的树详见下文整个磁盘。切换卷按v或点击侧边面板磁盘名旁的Volumes打开卷选择器。它列出系统上挂载的每个候选卷及其可用空间最满的排最前并过滤掉伪文件系统与重复的 btrfs/APFS 挂载点。选择任意条目即把扫描根直接重置为该卷。整个磁盘点击面包屑里的/或扫描根之上的任意目录、按g、运行disktree --disk或用启动器的Scan the whole disk动作。g和--disk扫描主目录所在的磁盘——Omarchy 和 macOS 上都是/。macOS 上 Data 卷的第二个挂载点/System/Volumes/Data会被跳过它是/Users、/Applications等目录的另一个名字。宽化是记忆化的已经测过的树会被交给更宽的遍历并在到达处复用所以从~扩到/只读取~之外的内容在这台机器上只需几秒而非完整重扫。当前视图在更宽的树就绪前保持显示就绪后以你之前所在目录为选中项打开。退回去只是导航。一次扫描停留在单个卷上而且卷指的是挂载源而非设备号btrfs 给每个子卷自己的st_dev因此/home、/var/log、/var/cache/pacman/pkg都会被包含而/proc、/sys、/run、tmpfs、/boot、其他磁盘、网络共享和 automount 点都被排除按路径检查所以自动挂载的 NAS 绝不会被挂载来测量。快照子卷同样排除它们的文件与在线文件共享块统计它们等于把磁盘算了两遍。-X则跨入一切。没有 root 权限时部分系统目录无法读取它们会在顶栏按不可读计数而不是被猜测估值。Windows 上的行为差异同一个程序以下是 Windows 对各问题的回答磁盘用量是 NTFS 为每个文件报告的分配量整簇计压缩或稀疏文件少计小到能住进文件记录的文件不计。它随目录列表本身一起到达FileIdExtdDirectoryInfo所以不比遍历多花成本。NTFS 上硬链接只算一次。整个磁盘是配置文件所在的驱动器通常是C:\。其他卷挂载的文件夹是链接类似 junction不会被进入因此扫描停留在一个卷上-l跟随链接包括已挂载的文件夹。以管理员运行时整盘改为直接读 NTFS 主文件表MFT而非遍历就像 WizTree 那样对表做一次大块读取。在一个 400 万文件的C:\上这大约耗时 3.4 秒对照 WizTree 的 11.2 秒和遍历的约 20 秒。它还能看到遍历被拒绝的东西比如 System Volume Information。它只用于整块 NTFS 盘——文件夹扫描仍要付出整张表的成本——且不与-l同用表的链接不被跟随。disktree 在自身删除后会刷新卷让重扫立即可见其他程序几秒前的改动则可能尚未显示。未以管理员启动时disktree 照常遍历在整块 NTFS 盘未加-l上或 Windows 拒绝遍历某个文件夹时侧边面板会提供Restart as Administrator通过 UAC 提示以相同文件夹与选项重开宽化扫描期间则是正在扫描的更宽文件夹。移到回收站即 Recycle Bin经 shell 文件操作完成它在无法回收任何东西而将销毁时会先询问。除下述规则外被拒绝的Windows、Program Files 和 ProgramDataWindows 放在驱动器顶部的东西System Volume Information、Recovery、Boot以及设置可关闭的分页与休眠文件任何承载你配置文件的文件夹如C:\Users以及配置文件文件夹中的每个配置文件含Public和Default——因为提权的 disktree 可能以另一个账户运行并能触达它们全部。配置文件内部的东西仍可删除如同你自己账户下那样。名字比较不区分大小写如同 Windows 的比较方式。隐藏指以点开头的名字或隐藏属性因此-H会像资源管理器那样去掉AppData。主题跟随 Windows 的浅色/深色设置因为没有 Omarchy 主题可跟随。macOS、GNOME、KDE 上同样如此。Windows 的这些规则在源码中都能找到对应系统树清单SystemRoot、ProgramFiles、ProgramData、pagefile.sys、hiberfil.sys等在 removal.rs配置文件目录保护在 removal.rsWin32 会误读的名字尾随点/空格、NUL、COM1–COM8、LPT9、冒号流等在 misread_by_win32且均有对应测试。它拒绝做什么删除规则全部集中在 removal.rs每条都有测试只有扫描根之下的路径才能被删除文件系统根、扫描根和你的主目录都被拒绝挂载点被拒绝内部含有挂载点的目录同样被拒绝——删除它会伸入另一个文件系统永久删除还在挂载边界停下而不是深入其中未挂载的 btrfs 子卷会随其目录一起删除如扫描所示承载主目录或系统树的目录被拒绝macOS 上/Users与/同卷/opt承载/opt/homebrew系统树/usr、/etc、/boot、/var/lib、/nix/store、/gnu/store、macOS 与 Linux 上 Homebrew 的前缀等即使在权限允许时也被拒绝这些目录归软件包所有pacman、paccache 或journalctl --vacuum才是正确的工具符号链接只解除、绝不跟随任何东西都不经过 shell——名为-rf的文件只是一个文件选中检出目录时绝不运行它命名的程序git 以 fsmonitor、hooks 和 pager 全关的方式被询问定义了自有 filter driver 的检出目录根本不会被询问状态显示改动未知。非 Windows 平台的系统树清单共 24 项定义于 SYSTEM_TREES。防护比较对拼写做了归一化macOS 会把/System/Volumes/Data/Users/x折叠为/users/x并忽略大小写Windows 亦然——被移除的始终是标记时的原路径归一化只用于判断。在 Hyprland 上Hyprland 会平铺新窗口所以 disktree 会开进被分配到的瓦片里。它是为宽敞的窗口设计的请让它浮动或给它一条规则。窗口类名为disktree这也是 main.rs 中设置的 Wayland app id左不设置则类名为空、规则永不匹配windowrule float, class:^(disktree)$ windowrule size 1400 900, class:^(disktree)$开发make run # release 构建扫描 $HOME make lint # rustfmt --check然后 clippy 把每条警告当错误 make test # 扫描、布局与删除测试外加窗口测试台测试 make ci # lint然后 testlint 门槛是有意从严的clippy::all和clippy::pedantic都是错误每条例外都带着理由写在Cargo.toml里。窗口测试台测试会绘制真实帧、按下真实按键——其中一条标记一个目录、确认删除、并检查文件确实没了而邻居还在。路径里面有什么crates/disktree-core扫描、树、方形化布局、可用空间与删除——无 UIcrates/disktree-app/src/state.rs界面能做的每个动作以及按键映射crates/disktree-app/src/views.rs各屏幕crates/disktree-app/src/treemap_view.rs绘制马赛克及其标签crates/disktree-app/src/ui.rs间距、字号与尺寸刻度全部用remcrates/disktree-app/src/tests.rs透过真实窗口的端到端测试packaging/、assets/、Makefile桌面入口、图标与安装界面遵循 GPUI Kit 设计指南所有尺寸位于同一个rem刻度上因此界面缩放能保持比例主色只留给 Enter 做的事应用唯一会问的问题就是那个无法挽回的问题。许可MIT。赞分享【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust GPUI.项目地址https://gitcode.com/gh_mirrors/di/disktree点击查看免费下载相关推荐TDengine 数据删除DELETE实战指南语法、安全删除与磁盘空间回收TDengine 数据删除DELETE实战指南语法、安全删除与磁盘空间回收 TDengine 的 DELETE 语句用于从普通表、子表或超级表中删除数据数据库时序数据库物联网大数据实时分析云原生npkill 使用指南扫描全盘 node_modules 目录、查看占用并一键释放磁盘空间npkill 使用指南扫描全盘 node_modules 目录、查看占用并一键释放磁盘空间 npkill 是一款用 TypeScript 编写的交互式命令行工pstack Worktree Cleanup 实践指南安全回收磁盘空间的六步安全门禁流程pstack Worktree Cleanup 实践指南安全回收磁盘空间的六步安全门禁流程 导读 本文基于 pstack 插件中 poteto mode 的AI 技能AI 插件插件系统AI Agent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑