☰
Mac 变卡自救清单里的 fsearch:公众号热传的开源工具,普通人怎么用起来
2026/10/10 16:10:51 网站建设 项目流程

Mac 变卡自救清单里的 fsearch:公众号热传的开源工具,普通人怎么用起来

【免费下载链接】fsearchWhole-disk file search for macOS: fuzzy names, typo tolerance, indexed content grep. ~1 ms over 8M files.项目地址: https://gitcode.com/gh_mirrors/fsea/fsearch

Mac 用两年变卡,很多时候不是硬件不行,而是系统里塞了太多用不上的东西。近期一篇公众号文章把这件事讲透了,并给出了三个开源工具组成的"自救清单":RemoveMacAI 负责一键关掉 Apple Intelligence、分析上报和推荐广告,Tendedero 负责把截图自动收进角落,而夹在中间的 fsearch,负责全盘文件搜索——模糊匹配、拼错容忍,比系统自带快。这份清单的真实性先不论,单说 fsearch 这个工具本身:它在仓库里的实测数据是 770 万文件全盘搜名字 p50 只要 1.3 毫秒,这已经超出了"快"的范畴,值得把它拆开看看凭什么,以及普通人到底怎么用起来。

公众号推荐了什么:三个卖点,件件有源码背书

公众号对 fsearch 的推荐浓缩成一句话:全盘搜索、模糊匹配、拼错容忍,比系统自带快。这三个卖点在这个仓库里都能找到对应的实现,不是营销话术。

  • 全盘搜索:工具的设计目标就是整块磁盘一次索引。README 开头就写明 "Whole-disk file search for macOS",实测环境是 M4 Max 上 770 万个文件和文件夹,任意文件名搜索 p50 仅 1.3 毫秒,内容搜索 p50 9 毫秒,新建/重命名/删除的文件约 0.1 秒内就能出现在结果里(见 README.md 的 Speed 一节)。
  • 模糊匹配:名字匹配采用 fzf-v1 风格的模糊评分算法,按左对齐结束、从右侧收缩的方式找到最优命中,再叠加边界、驼峰、连续命中三类加分(见 src/query.rs 的fuzzy_score)。所以你不必记住文件名全拼,敲fsearch的几个首字母也能把fsearch main.rs揪出来。
  • 拼错容忍:代码里定义了明确规则——5 个字母以上的单词允许容忍 1 个拼写错误,代价是 60 分(见 src/query.rs 中TYPO_MIN_LEN = 5与TYPO_COST = 60)。one_edit_prefix会处理错写、多写、漏写、交换相邻字母四类单次编辑,并且数字永远不参与纠错("hat_18" 不会因为拼错变成 "hat_98")。README 给出的例子很直观:mian.rs能搜到main.rs。

仓库里还留了一份与竞品的实测对比:在同样的 Mac、同样的 Chromium 源码树(50.9 万文件)下,按名字搜索 1.1ms 对 13.8ms,内容搜索 5.6ms 对 53ms,拼错后仍能命中目标的比例 98% 对 88%,启动就绪 50ms 对 2.5s,而内存占用是 50MB(全盘)对 358MB(仅该文件夹)。完整过程录在 demo/fsearch-vs-fff.mp4,测试方法见 demo/vs_fff.py。

快不是玄学:一次索引、常驻增量

fsearch 快在架构上把"搜索"拆成了"建索引"和"查索引"两件事,普通人感知到的毫秒级响应只是后者。

首次运行时,它通过getattrlistbulk系统调用并行爬一遍整盘——一次系统调用能带回成百上千条条目的名字、类型、大小、修改时间,免去了逐文件 stat 的开销(见 src/walk.rs 头部注释)。爬完生成一个 mmap 即可映射使用的扁平索引文件(src/index.rs),首次全盘构建约 20 秒,仅此一次。

之后磁盘上任何变化都由 FSEvents 流实时跟进:每个目录事件到来时,只重列那一个目录并与索引做幂等 diff(见 src/fsevents.rs 与 src/live.rs)。守护进程常驻内存 30–135MB,换来的是每次搜索都在内存里的索引上做向量化扫描。

还有两个值得说的细节:

  • 名字内联:770 万个条目实际只共享约 200 万个不同文件名,所以每个名字只存一份,查询先对"不同名字"评分、再落到条目,命中面急剧缩小(src/index.rs)。
  • 绝不误触 iCloud:主程序启动即调用setiopolicy_np关闭 dataless 文件物化(见 src/main.rs 与 src/engine.rs 的no_materialize)。对 iCloud 用户这是刚需——搜索或索引永远不会因为列目录而把云端占位文件下载到本地。

内容搜索则是另一套独立的 trigram(三字组)倒排索引,只覆盖文本类文件,且会跳过node_modules、.git、target、各类缓存等目录(src/content.rs)。候选文件在命中后重新从磁盘读取真实验证,所以结果永远不过期。

安装与首次使用:普通人三分钟也能跑起来

需要先说清楚:这个 fsearch 是命令行工具 + 后台守护进程的组合,没有传统意义上的图形界面。但普通人上手只需要三条命令:

cargo build --release && ./target/release/fsearch install # 装到 ~/.local/bin/fsearch fsearch fsearch main # 按名字找文件 fsearch 'ext:rs grep:apply_dir' # 在文件内容里搜

install会把二进制复制到~/.local/bin/fsearch,守护进程在首次使用时自动启动;加--login则注册一个 LaunchAgent 登录自启(见 src/main.rs 的install逻辑)。索引文件存放在~/Library/Application Support/FSearch/,JSON 接口走fsearch.sockunix socket(src/server.rs)——这意味着任何第三方图形前端、快捷键工具都能通过 socket 或fsearch stdio接上它,普通人将来会等到更友好的图形化封装。

唯一需要留意的坑是 macOS 的完全磁盘访问权限(Full Disk Access):

  • 从已授权完整磁盘访问的终端启动时,fsearch 会索引全部内容;
  • 作为登录项(fsearch install --login)运行时,需要到 系统设置 → 隐私与安全性 → 完全磁盘访问权限 里给~/.local/bin/fsearch单独勾选授权,并且每次重新编译安装后都要再授权一次;
  • 未授权时它不会弹窗打扰,而是静默跳过 Downloads、Desktop、Documents 等受保护目录(src/engine.rs 的gated列表)。权限判断读的是系统 TCC 数据库是否可读(has_full_disk_access),非常干净利落。

首次建索引约 20 秒,期间fsearch status会提示 indexing,之后就是随用随到的状态。

日常用法:找大文件、清磁盘、定位散落文档

fsearch 真正拉开与系统自带搜索差距的,是它这套可组合的过滤语法。README 给出的示例(README.md)加上源码里的解析逻辑(src/query.rs 的filter),凑成了三个普通人最常用的实战组合。

给磁盘瘦身:先看哪些东西最占空间。

fsearch 'type:video size:>1gb' # 找出所有超过 1GB 的视频 fsearch 'type:image size:>50mb' # 大于 50MB 的图片(RAW、扫描件) fsearch 'ext:dmg,zip,iso size:>500mb' # 安装包和镜像,删完通常立省几十 GB

type:背后是一份完整的扩展名映射表(图片、视频、音频、文档、代码、压缩包、字体七大类,见 src/query.rs 的TYPES),比手动记扩展名靠谱得多。

定位散落文档:结合时间与范围过滤。

fsearch 'ext:pdf in:~/Downloads mtime:<7d' # 最近一周下载的 PDF fsearch 'kind:dir size:>5gb' # 哪些文件夹在悄悄膨胀 fsearch 'mtime:>180d ext:doc,docx' # 半年没动过的旧文档,可以归档

in:不是事后过滤,而是把索引按目录组织成连续的区间,搜索范围直接收敛成一个区间边界(src/index.rs 的布局注释),所以"只在某个文件夹里找"不仅语义正确,而且更快。

内容级检索:记不清文件名、只记得里面写了什么,或者要找散落在各项目里的某个函数定义。

fsearch 'grep:发票号 ext:pdf' # 在 PDF 等文档内容里找 fsearch 'regex:fn\s+\w+_dir ext:rs' # 正则搜代码 fsearch 'sym:apply_dir' # 符号级定位函数定义位置

内容搜索默认限定在用户主目录内做 trigram 索引(src/content.rs),搜出结果后从磁盘实时读取验证——这意味着它搜到的内容永远是最新的,不会像某些索引工具那样给出过期快照。

组合拳:和 RemoveMacAI、Tendedero 一起给 Mac 减负

公众号清单里的另外两个工具,恰好和 fsearch 形成互补的三步工作流。

第一步,RemoveMacAI 先减负:一键关闭 Apple Intelligence、分析上报和推荐广告这类系统后台负担,从源头减少 Mac 的无谓开销。它的设计是每个改动都可逆,适合先跑一遍看效果。

第二步,fsearch 找出真正的"重灾区":Mac 变卡的另一半原因往往在磁盘——系统盘被撑到只剩几个 GB,swap 和缓存雪上加霜。用上一节的大文件组合拳,把type:video size:>1gb、ext:dmg,zip的结果扫一遍,删掉不用的安装包和旧视频,效果往往立竿见影。清理前可以先fsearch 'size:>100mb'全盘拉一遍清单,心里有数再动手。

第三步,Tendedero 收尾整理:它把桌面和屏幕上的截图自动挂到屏幕顶端的一条"晾衣绳"上,避免截图在桌面越积越多。而截图攒了几个月之后,想找某一张,正好用 fsearch 按名字和时间定位:fsearch 'mtime:<30d ext:png in:~/Desktop'或者直接搜type:image。

这套组合的妙处在于各自解决一类问题:RemoveMacAI 管后台负载,fsearch 管磁盘与文件定位,Tendedero 管视觉噪音,合起来就是一次完整的"Mac 减负"闭环。清理这件事最怕的"删了又找不到、找又找半天",恰好被 fsearch 的毫秒级搜索覆盖。

留给普通人的清单

fsearch 不是那种需要折腾半天才能用的工具,把它放进你的自救清单只需要四步:

  1. cargo build --release && ./target/release/fsearch install完成安装;
  2. 系统设置里给~/.local/bin/fsearch勾上完全磁盘访问权限(若用登录自启);
  3. 等首次建索引的约 20 秒过去;
  4. 从此把"系统搜索"这件事交给它:找文件直接敲,mian.rs也能搜到main.rs,清磁盘用type:video size:>1gb,找内容用grep:。

对开发者而言,它还是一个可直接链接的 Rust crate(src/lib.rs),JSON 接口与 API 让任何应用都能共享同一份索引、同一套搜索能力。普通用户拿来救急,开发者拿来当搜索基建,这个从公众号热传清单里走出来的小工具,两边的账都算得过来。

【免费下载链接】fsearchWhole-disk file search for macOS: fuzzy names, typo tolerance, indexed content grep. ~1 ms over 8M files.项目地址: https://gitcode.com/gh_mirrors/fsea/fsearch

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

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

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

立即咨询