Dustclaw:专为开发者设计的智能磁盘空间分析CLI工具
1. 项目概述Dustclaw一个专为开发者设计的磁盘空间分析器每个月总有那么几天看着系统盘那触目惊红的剩余空间你都会陷入沉思我的几百个G到底去哪儿了是Xcode的缓存又爆了还是Docker偷偷吃掉了半个硬盘你打开终端运行du -sh *然后在一堆文件夹里手动筛选或者用ncdu慢慢扫描整个过程既耗时又不够直观。对于开发者来说问题更复杂——我们需要的不是一个通用的磁盘用量查看器而是一个能理解我们工作流的“侦探”它能一眼看穿node_modules、DerivedData、.gradle这些特定目录的“真面目”。这就是Dustclaw诞生的背景。它不是又一个du的替代品而是一个专门为 macOS 和 Linux 开发者打造的、具备“领域知识”的磁盘空间分析 CLI 工具。它的核心思想是“情境感知”不仅告诉你哪个文件夹大更重要的是告诉你这个文件夹是什么属于哪个开发工具以及它是否可以被安全清理。当你运行npx dustclaw wasteland看到它精准地揪出 Docker 占用的 460GB 或者 npm 缓存的 14GB 时那种“原来罪魁祸首是你”的豁然开朗就是它最大的价值。2. 核心设计思路为什么选择“开发者情境感知”这条路市面上的磁盘工具已经很多了比如 Rust 写的、速度极快的dust和dua-cli还有界面美观的duf以及专门清理node_modules的npkill。它们都很优秀但Dustclaw选择了一条差异化的路径深度集成开发环境知识。2.1 从通用扫描到精准定位的转变传统的du或dust进行的是“无差别扫描”。它们递归计算每个目录的大小然后按大小排序。这对于找出“最大的文件夹”很有用但对于开发者来说信息粒度不够。例如~/Library/Caches这个目录可能显示为 50GB但这里面混杂了 Chrome、Spotify、Xcode、Homebrew 等数十个应用的缓存。你无法一眼看出哪个是“大头”更不敢轻易删除。Dustclaw的做法是内置一个“知识库”。这个知识库记录了各类开发工具、系统应用在 macOS/Linux 上的标准缓存、数据存储路径。当执行wasteland命令时它不会去扫描整个磁盘而是直接去这些预设的路径检查是否存在并计算其大小。这样得到的结果是结构化的、带有语义的“Docker Desktop: 460.5 GB”、“npm Cache: 14.1 GB”。你立刻就知道该找谁“算账”。2.2 技术选型Node.js 与 TypeScript 的权衡项目选择 Node.js 和 TypeScript 作为技术栈这是一个非常务实且贴合目标用户的选择。为什么是 Node.js生态与分发目标用户是开发者而前端/Node.js 开发者是其中很大一部分。通过 npm 分发意味着用户只需npx dustclaw即可运行几乎零成本上手无需处理 Rust/Go 的编译环境或包管理。文件系统 API 足够成熟Node.js 的fs模块特别是fs.promises和fs.stat经过多年发展对于完成递归统计文件大小、读取符号链接等核心任务已经非常稳定和高效。虽然绝对速度可能不及 Rust但对于非实时的磁盘分析任务其性能是完全可接受的。跨平台一致性Node.js 提供了相对一致的 API 来处理 macOS 和 Linux 的文件系统差异简化了开发。为什么是 TypeScript类型安全与知识库维护Dustclaw的核心资产是那个记录各种缓存路径的“知识库”。使用 TypeScript 可以严格定义每个“空间浪费者”的类型结构如名称、路径模式、描述、是否安全等在编译阶段就能发现拼写错误或路径错误极大降低了维护成本。更好的开发体验对于涉及大量路径操作和条件判断的 CLI 工具TypeScript 的智能提示和重构能力能显著提升开发效率和代码质量。性能考量有人可能会质疑 Node.js 在遍历大量小文件时的性能。Dustclaw通过两个策略缓解并行扫描在扫描模式 (scan) 下可以对子目录进行有限的并行统计充分利用 I/O 等待时间。避免重复统计wasteland命令直接定位特定路径避免了全盘递归速度极快。实操心得在构建这类工具时选择“够用且便捷”的技术栈往往比追求“极致性能”更重要。Dustclaw用 Node.js 换取了极佳的可分发性和开发者亲和力这个 trade-off 是明智的。如果你的主要场景是频繁扫描数千万文件的生产服务器那么 Rust 是更好的选择但对于个人开发机每月几次的清理Dustclaw的体验更胜一筹。3. 核心功能深度解析与使用指南Dustclaw提供了三个核心命令分别对应不同的使用场景。理解它们的设计意图能帮你更好地利用这个工具。3.1dustclaw快速全局概览这是默认命令运行时不带任何参数。它的目标是给你一个 10 秒钟的磁盘健康快照。它做了什么磁盘使用情况首先会像df -h一样列出所有挂载点Mount的总容量、已用空间、可用空间和使用百分比。这让你对整体情况有个数。最大项排行然后它会默认扫描当前工作目录或通过-p指定的目录找出其中最大的 10 个文件或文件夹并以一个清晰的表格展示。常用参数解析-n, --top count改变显示的最大项数量。例如dustclaw -n 20显示前 20 名。-p, --path path指定扫描的起始路径。例如dustclaw -p ~/Projects只分析你的项目文件夹。输出解读示例Mount Total Used Free Use% / 500G 420G 80G 84% Largest items in /Users/you: Size Path 45.2 GB /Users/you/Library/Developer/Xcode/DerivedData 32.1 GB /Users/you/Movies 18.5 GB /Users/you/.docker从这个输出你一眼就能看出 Xcode 的构建数据是当前用户目录下的“空间第一杀手”。3.2dustclaw scan [path]深度定制化扫描当概览信息不够你需要更细致地探查某个特定目录时就该使用scan命令。这是Dustclaw作为通用磁盘分析器的核心能力。核心特性递归大小计算准确计算每个文件和目录的磁盘占用。排序与筛选结果默认按大小降序排列。多种筛选器这是它比简单du强大的地方。高级参数详解--older-than age非常实用的功能。格式支持30d(30天)、6m(6个月)、1y(1年)。例如dustclaw scan ~/Downloads --older-than 90d专门找出下载文件夹里那些陈年旧文件它们往往是清理的首选目标。--files-only/--dirs-only有时你只想找大文件比如忘记删除的虚拟机镜像.iso文件或者只想找大文件夹比如臃肿的依赖目录这个筛选器能帮你精准定位。-d, --depth depth控制扫描深度。-d 1只查看直接子项速度最快-d 3或更深则能发现嵌套的“巨无霸”。在未知目录中探索时建议先浅层扫描 (-d 2)定位到可疑的大目录后再对其深层扫描。-n, --top count同概览命令控制显示数量。一个典型工作流# 1. 发现 Home 目录下最大的东西 dustclaw scan ~ -n 15 # 2. 输出显示一个叫 old_backups 的文件夹很大进一步探查里面是什么 dustclaw scan ~/old_backups --files-only --older-than 1y # 3. 发现里面全是超过一年的 .tar.gz 文件确认后可安全删除注意事项scan命令在处理包含大量小文件或符号链接的目录如node_modules时可能会比较慢因为每个stat调用都有开销。这是所有基于遍历的工具的通病。如果遇到这种情况可以考虑直接使用wasteland --node-modules来专门处理node_modules。3.3dustclaw wasteland开发者专属的“垃圾场”探测器这是Dustclaw的杀手锏功能。它不进行泛泛的扫描而是直接拿着“黑名单”去系统里抓“通缉犯”。“知识库”涵盖的类别开发工具缓存与数据Xcode:DerivedData(构建中间文件)、Archives(打包文件)、iOS DeviceSupport(设备支持文件尤其容易巨大)。Docker: Docker Desktop 的虚拟机镜像和容器数据层通常在~/Library/Containers/com.docker.docker下动辄上百 GB。包管理器缓存: npm (~/.npm/_cacache)、pnpm (~/.pnpm-store)、Yarn、Homebrew、Cargo、pip 的全局缓存。构建系统缓存: Gradle (~/.gradle/caches)、Maven (~/.m2/repository)。模拟器与运行时Android AVD 镜像 (~/.android/avd)、Playwright/Chromium 等自动化测试浏览器。应用缓存系统化遍历~/Library/Caches(macOS) 或~/.cache(Linux)将每个应用的缓存目录单独列出而不是合并成一个总数。系统垃圾用户的废纸篓 (~/.Trash)。命令参数--node-modules path这是一个补充扫描。除了检查预设的“黑名单”还会递归查找指定路径下所有的node_modules目录并计算其总大小。例如dustclaw wasteland --node-modules ~/Projects。输出价值wasteland的报告直接给出了“可回收空间”的估算。它列出的每一项都是经过社区验证的、通常可以安全清理或至少需要审视的空间占用。这为你提供了明确的清理行动指南。4. 安装、配置与集成工作流4.1 安装方式选择全局安装推荐用于频繁使用npm install -g dustclaw # 或使用 yarn yarn global add dustclaw # 或使用 pnpm pnpm add -g dustclaw安装后直接在终端任何位置使用dustclaw命令。临时使用最快捷npx dustclawnpx会自动下载并运行最新版本的dustclaw无需安装。适合偶尔使用或首次体验。4.2 与 Shell 集成创建清理别名你可以将常用的dustclaw命令设置为 shell 别名提升效率。在~/.zshrc或~/.bashrc中添加# 快速查看磁盘概览 alias dsdustclaw # 扫描当前目录下的大文件仅文件前20名 alias dsfdustclaw scan . --files-only -n 20 # 一键检查所有已知“垃圾场” alias dswdustclaw wasteland # 专门查找老文件当前目录下超过180天 alias dsodustclaw scan . --older-than 180d添加后执行source ~/.zshrc使配置生效。4.3 集成到自动化脚本利用--json标志可以将dustclaw的输出转换为结构化 JSON便于与其他工具集成或编写自动化清理脚本。示例创建一个每周清理旧下载文件的脚本cleanup_old_downloads.sh#!/bin/bash # 使用 dustclaw 找出下载文件夹中超过90天的文件输出JSON DUST_OUTPUT$(dustclaw scan ~/Downloads --older-than 90d --files-only --json) # 使用 jq 解析 JSON获取文件路径列表 echo $DUST_OUTPUT | jq -r .items[] | .path | while read file; do echo Considering for deletion: $file # 这里可以添加确认逻辑或者直接移动到废纸篓 # mv $file ~/.Trash/ done echo Old files report generated.注意自动化删除非常危险上述脚本仅列出了文件实际删除操作 (rm或mv) 务必在充分测试和确认后或在脚本中加入交互式确认环节再启用。5. 实战场景系统性清理 macOS 开发机磁盘空间让我们模拟一个真实的场景你的 512GB MacBook 系统盘只剩下不到 20GB 空间系统频繁弹出警告。你决定使用Dustclaw来打一场漂亮的“空间收复战”。5.1 第一阶段侦察——全面评估首先运行dustclaw获取全局概览。dustclaw输出会告诉你哪个磁盘分区最紧张以及当前目录下最大的几个文件夹。假设你发现/根目录使用率已达 94%。接着运行核心侦察命令dustclaw wasteland这个命令会运行一两分钟然后给你一份详尽的报告。假设报告如下摘录Wasteland Report Known space wasters: ┌────────────────────────────────┬───────────┬──────────────────────────────────────────────────┐ │ Name │ Size │ Path │ ├────────────────────────────────┼───────────┼──────────────────────────────────────────────────┤ │ Docker Desktop │ 210.5 GB │ ~/Library/Containers/com.docker.docker/Data │ │ Xcode DerivedData │ 45.8 GB │ ~/Library/Developer/Xcode/DerivedData │ │ npm Cache │ 12.1 GB │ ~/.npm/_cacache │ │ Cache: Google/Chrome │ 8.9 GB │ ~/Library/Caches/Google/Chrome │ │ iOS Device Support │ 7.2 GB │ ~/Library/Developer/Xcode/iOS DeviceSupport │ │ pnpm Store │ 6.4 GB │ ~/Library/pnpm/store │ │ Homebrew Cache │ 5.3 GB │ ~/Library/Caches/Homebrew │ │ Android Emulators │ 4.1 GB │ ~/.android/avd │ └────────────────────────────────┴───────────┴──────────────────────────────────────────────────┘ Total reclaimable: ~301.3 GB战果分析最大的“肥羊”是 Docker (210GB) 和 Xcode 构建数据 (46GB)。仅这两项就足以解决空间危机。5.2 第二阶段攻坚——针对性清理目标 1清理 DockerDocker 占用巨大通常是因为积累了大量的镜像、容器和构建缓存。安全操作首先在 Docker Desktop 应用中停止所有运行中的容器。清理命令# 删除所有停止的容器、未使用的网络、悬空镜像和构建缓存 docker system prune -a --volumes注意-a会删除所有未被容器使用的镜像包括你可能想保留的。如果不确定可以先运行docker system df查看详情或使用docker system prune不带-a进行更保守的清理。进阶清理如果prune后空间释放仍不理想可以考虑重置 Docker Desktop在它的设置里但这会删除所有数据慎用。目标 2清理 Xcode DerivedData这是 Xcode 的构建中间文件删除后项目再次编译时会重新生成通常安全。# 直接删除整个文件夹 rm -rf ~/Library/Developer/Xcode/DerivedData/或者如果你使用 Xcode可以在Xcode - Preferences - Locations里点击Derived Data旁边的箭头打开文件夹然后手动删除。目标 3清理 npm 和 pnpm 缓存这些是下载的包缓存清理后下次安装时会重新下载。# 清理 npm 缓存 npm cache clean --force # 清理 pnpm 存储 pnpm store prune目标 4清理 Homebrew 缓存Homebrew 下载的软件包安装后其缓存文件通常可以删除。brew cleanup --pruneall5.3 第三阶段扫荡——清理应用缓存与老文件使用dustclaw scan进行精细排查# 1. 查看下载文件夹里的老文件 dustclaw scan ~/Downloads --older-than 180d -n 30 # 2. 查看文档文件夹里的大文件可能是忘记的虚拟机镜像、视频素材等 dustclaw scan ~/Documents --files-only -n 20根据扫描结果手动审查并删除不再需要的文件。清理系统与应用缓存 对于wasteland报告中列出的其他应用缓存如 Chrome、Spotify你可以手动删除直接进入~/Library/Caches下的对应文件夹删除。使用专业工具如OnyX(macOS) 或BleachBit(Linux) 进行更安全的系统清理。注意清理应用缓存可能导致应用下次启动稍慢需要重建缓存但通常不会丢失重要数据。5.4 第四阶段巩固——建立预防机制清理完成后可以建立一些习惯防止问题复发定期运行侦察在日历中设置每月提醒运行dustclaw wasteland检查。配置 Docker在 Docker Desktop 设置中限制其最大磁盘使用量。管理 Xcode定期清理DerivedData和Archives。对于不用的旧版本iOS DeviceSupport可以安全删除。使用--older-than参数定期扫描下载、文档等文件夹清理陈旧文件。6. 常见问题排查与技巧实录即使工具设计得再完善在实际使用中也可能遇到各种情况。以下是一些常见问题的解决思路和高级技巧。6.1 问题dustclaw扫描速度很慢特别是某个目录可能原因与解决方案原因 1目录中包含海量小文件或深度嵌套的符号链接。技巧使用-d参数限制扫描深度。先dustclaw scan -d 1 /可疑路径找出顶层的大目录再针对性地深入扫描。技巧对于已知的“重灾区”如node_modules直接使用dustclaw wasteland --node-modules /路径它比通用扫描更高效。原因 2扫描网络驱动器或外部慢速存储。注意dustclaw的扫描速度受限于存储设备的 I/O 性能。扫描网络位置如 SMB 挂载会非常慢。建议只在本地磁盘或高速 SSD 上使用。原因 3系统权限问题导致某些目录无法访问反复重试。排查观察命令输出看是否有权限错误提示。可以使用sudo dustclaw scan /扫描根目录但需谨慎且wasteland命令可能不适用于sudo因为它依赖用户主目录路径。6.2 问题wasteland报告的大小与 Finder/du显示的不一致可能原因计算方式差异dustclaw默认使用fs.stat获取的size逻辑大小而 Finder 或某些du参数可能显示的是磁盘上的占用块大小物理大小。对于稀疏文件或有很多小文件的目录两者会有差异。符号链接dustclaw在处理符号链接时默认会跟踪并计算链接目标的大小。而du -sh如果不加-L参数则不会跟踪。缓存与实时性扫描过程中如果有文件正在被修改结果可能不精确。解决方案 这种差异通常很小不影响判断“大体量”的结论。如果差异巨大可以尝试# 使用 du 命令对比-L 表示跟踪符号链接-c 显示总计 du -shL ~/Library/Containers/com.docker.docker将结果与dustclaw wasteland中 Docker 项对比。6.3 问题我想清理但不确定某个缓存文件夹是否安全黄金法则如果不确定就不要删除。或者先移动mv到另一个位置如桌面或外部硬盘观察一段时间系统或应用是否运行正常再彻底删除。针对特定缓存的建议~/Library/Caches/绝大多数可以安全删除。最坏情况是应用重启变慢或需要重新登录。~/.npm/_cacache安全。npm install时会重新下载。~/Library/Developer/Xcode/DerivedData安全。Xcode 项目重新编译时会重建只是首次编译会慢一些。~/Library/Containers/com.docker.docker危险。这是 Docker 的全部数据删除等同于重置 Docker。务必先使用docker system prune等命令清理内部数据。~/.gradle/caches相对安全但删除后 Gradle 构建会重新下载依赖首次构建很慢。可以只删除其中的modules-2等子目录下的文件保留wrapper。6.4 技巧将dustclaw与图形化工具结合使用dustclaw擅长快速定位问题而图形化工具如GrandPerspective(macOS) 或Filelight(Linux) 擅长可视化展示。可以组合使用用dustclaw wasteland快速找到最大的嫌疑犯例如 Docker。用dustclaw scan ~/Library/Containers/com.docker.docker -n 50深入查看 Docker 数据文件夹内部的具体大项。如果内部结构依然复杂将路径复制到GrandPerspective中扫描通过矩形树状图直观地看到底是哪个镜像或卷占用了空间。6.5 技巧处理“其他宗卷”或“系统数据”占用过大在 macOS 的“关于本机-存储空间”里经常看到“系统数据”或“其他宗卷”占用巨大且无法直接清理。dustclaw可以帮助你剖析这部分运行sudo dustclaw scan / -d 3需要密码。注意扫描根目录需要小心不要误操作系统文件。重点关注/private/var目录特别是/private/var/folders这是系统缓存和临时文件的家以及/Library下的各种日志、缓存。对于Time Machine本地快照它可能隐藏在“系统数据”中。可以使用命令tmutil listlocalsnapshots /查看并用tmutil deletelocalsnapshots清理。重要警告以sudo身份扫描或删除系统级目录 (/,/private,/Library) 下的文件风险极高。除非你非常清楚你在做什么否则只应进行查看 (scan)而不要轻易删除。对于系统缓存更安全的做法是重启电脑macOS 会自动清理部分缓存或使用专业的清理工具。7. 进阶理解dustclaw的工作原理与扩展可能性要真正玩转一个工具有时需要了解它的内部机制。7.1 “知识库”是如何工作的Dustclaw的核心是一个用 TypeScript 定义的对象数组大概结构如下interface SpaceWaster { name: string; // 如 “Docker Desktop” patterns: string[]; // 路径模式支持 ~ 扩展和通配符 description: string; isCache: boolean; // 是否是缓存通常可安全清理 platform: (darwin | linux)[]; // 适用的平台 } const wastelandDefinitions: SpaceWaster[] [ { name: Docker Desktop, patterns: [~/Library/Containers/com.docker.docker/Data/**], description: Docker virtual machine images, containers, and volumes, isCache: false, // 这是核心数据不是简单缓存 platform: [darwin] }, { name: npm Cache, patterns: [~/.npm/_cacache], description: Cached npm package tarballs, isCache: true, platform: [darwin, linux] }, // ... 更多定义 ];当执行wasteland命令时程序会遍历这个列表对每个pattern进行路径解析将~扩展为用户主目录和文件存在性检查如果存在则使用递归函数计算该路径的总大小。7.2 如何为dustclaw贡献新的“空间浪费者”定义如果你发现了一个dustclaw尚未覆盖的、常见的“磁盘空间杀手”比如某个新出的开发工具的巨大缓存路径你可以向开源项目提交 Pull Request。Fork 项目仓库。在源代码中找到wastelandDefinitions数组通常在src/wasteland.ts或类似文件中。按照现有格式添加一个新的SpaceWaster对象。确保patterns路径正确并填写清晰的name和description。提交 PR。你的贡献将帮助所有开发者。7.3 性能优化异步递归与并行扫描在实现scan命令时一个关键的挑战是如何高效地递归统计成千上万个目录。Dustclaw采用了异步递归的方式并可能在某些层级上使用有限的并行处理来加速 I/O 等待。基本算法伪代码async function getSize(path, depth, maxDepth) { const stats await fs.stat(path); let totalSize stats.size; if (stats.isDirectory() depth maxDepth) { const entries await fs.readdir(path); // 可选对 entries 进行分块并行处理每个块的子项统计 const subDirSizes await Promise.all( entries.map(entry getSize(pathJoin(path, entry), depth 1, maxDepth)) ); totalSize subDirSizes.reduce((sum, size) sum size, 0); } return totalSize; }并行处理可以提升速度但要注意文件系统并发操作的限制过多的并行可能反而降低性能。dustclaw可能在这里做了平衡对于深度扫描适度的并行能有效利用现代 SSD 和 CPU 的多核能力。经过这样一轮从原理到实战从使用到排查的深度剖析Dustclaw已经不再是一个简单的命令行工具而是你管理开发环境磁盘空间的一个强大盟友。它用开发者思维解决了开发者的痛点这种精准的定位正是其价值所在。下次当磁盘空间告急时别再盲目地删除文件让dustclaw为你指明方向精准清理。