Cardinal: macOS 的快速文件搜索(已开源) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ldm0
V2EX    分享创造

Cardinal: macOS 的快速文件搜索(已开源)

  •  
  •   ldm0
    ldm0 2 天前 1668 次点击

    从 Windows 迁移到 macOS 后一直想有一个 macOS 的 Everything ,踩了很多坑之后终于实现出来了(磨磨唧唧写了 N 久)。

    我自己用了有一段时间了,确实帮我解决了 Spotlight 搜索不到一些文件的问题,而且速度也够快,我自己很喜欢,所以分享给大家。

    实现过程中走了很多弯路,如果最近事情不多的话,找时间分享一下踩坑历程和实现思路 :D

    目前项目已开源:https://github.com/ldm0/cardinal,大家可以在 release 页面下载。

    UI

    42 条回复    2025-11-09 04:25:36 +08:00
    Mangozhen
        1
    Mangozhen  
       2 天前   1
    下载了,来试一试。
    astrodaw
        2
    astrodaw  
       2 天前   2
    体验不错,略微有点卡顿但是可以接受。

    我此前一直用的 Alfred 的 find 命令来替代 macOS 的 Everything ,和楼主的软件使用体验大差不差。
    Mangozhen
        3
    Mangozhen  
       2 天前   1
    @Mangozhen 非常棒的一个 APP ,确实有 Everything 那个味儿了。初步体验了一个小时,有以下反馈:

    1. 初始化要的时间比较长,我这边大约 400 万个文件,花费了差不多 45 分钟来建立索引;
    2. 当前版本似乎不支持后台运行。推出后立即进入,会卡顿一下(大约是更新索引)。
    3. 特别想要能够自动进行关键词匹配,而不是完全匹配搜索。
    dxppp
        4
    dxppp  
       2 天前   1
    支持一下
    ldm0
        5
    ldm0  
    OP
       1 天前
    感谢反馈~
    > 初始化要的时间比较长,我这边大约 400 万个文件,花费了差不多 45 分钟来建立索引;
    这个还比较奇怪,正常不会有这么慢,我的电脑 700 万个文件应该是 11 秒索引完。有插存储卡之类的东西嘛。
    > 当前版本似乎不支持后台运行。推出后立即进入,会卡顿一下(大约是更新索引)。
    是加载磁盘里的缓存。
    > 特别想要能够自动进行关键词匹配,而不是完全匹配搜索。
    是说分词+模糊匹配嘛
    LLSY
        6
    LLSY  
       1 天前   1
    下载了,star 了,支持一下
    rj
        7
    rj  
       1 天前   1
    下载支持
    Mangozhen
        8
    Mangozhen  
       1 天前
    @ldm0 对的。在 Spotlight 上,我只需要舒服“A B”,会自动帮我把包含“A”和“B”两个关键词的文档抓出来(包括文档内容)。

    这个功能我真的离不开。因为很多时候我都是靠记忆的关键词来检索很久没用的文档。这也是为什么我至今一直使用的 Spotlight ,而没有使用其它类似的工具。
    duxiansen
        9
    duxiansen  
       1 天前   1
    我的索引也很慢,看了下,好像是在检索 iCloud 云盘的时候,触发了下载。后面能不能增加屏蔽某些目录的功能?
    ldm0
        10
    ldm0  
    OP
       1 天前
    @Mangozhen
    > 这个功能我真的离不开。因为很多时候我都是靠记忆的关键词来检索很久没用的文档。这也是为什么我至今一直使用的 Spotlight ,而没有使用其它类似的工具。

    这个软件主要提供了文件路径子串搜索(比如匹配"/Applications/Xcode.app/Contents/Developer" 路径中的 ".app/Contents/Develop")和正则搜索的支持,这也是 Everything 的最核心功能。

    如果要实现分词,搜索的能力感觉就不那么“确定性”了,用起来心里会虚虚的,和设计的初衷有些差别。SpotLight 可能会出现有某个文件但是搜索不到或者搜索不全的情况。Cardinal 和 SpotLight 的最主要差别就是其用起来的感觉是“确定性”的,能搜到就是有,搜不到就是没有。

    比如说我开发过程会产生一些细碎文件,SpotLight 在这种场景下更新索引总是不够实时,容易找不到文件,Cardinal 就 100%能找到,只要存在于文件系统上的文件都不会丢失。

    因为面向的需求不一样,所以形态和实现都会有差别~
    ldm0
        11
    ldm0  
    OP
       1 天前
    @duxiansen 这个我操作一手。检索 iCloud 应该不会下载(因为只是 readdir),应该是缩略图获取才会触发。

    这个我用 OneDrive 的时候发现了类似的情况,之前在代码里加了判断。我本地测试一下 iCloud 。
    ziyanghua
        12
    ziyanghua  
       1 天前   1
    star 支持一下
    ldm0
        13
    ldm0  
    OP
       1 天前
    @duxiansen https://github.com/ldm0/cardinal/releases/tag/v0.1.1 发了个新版,可以再试试看~
    duxiansen
        14
    duxiansen  
       1 天前
    这修复的效率真高。试了下,现在索引很快了
    Heanes
        15
    Heanes  
       1 天前
    没有排序选项吗?恳求加 feature
    ldm0
        16
    ldm0  
    OP
       1 天前
    @Heanes 由于 APFS 的 lstat 接口太慢了(被 NTFS 暴打),没有办法在构建索引时全量获取文件 metadata 。如果苹果不优化的话,没有办法全量排序。因此折中提供了一个 events panel (里面有最新更新的文件列表)

    但是搜索结果的排序我会加下(比如搜索结果小于 1w 个时可以根据 path/mtime/ctime 排序),这个在 todo list 上。
    clementewy
        17
    clementewy  
       1 天前   1
    这个厉害了,能搜 smb 文件,虽然还比较慢
    clementewy
        18
    clementewy  
       1 天前
    真好用,能否增加目录屏蔽功能,很多目录其实不需要索引。
    ldm0
        19
    ldm0  
    OP
       1 天前
    @clementewy 可以~晚上下完班加一手
    rainfox
        20
    rainfox  
       1 天前
    已经放弃 Intel 版本的了吗?
    pyre
        21
    pyre  
       1 天前
    太棒了,晚上回去用起来了再来反馈
    asdfasasdf
        22
    asdfasasdf  
       1 天前
    用起来很好,希望有个像 Alfred 的 in 功能,可以匹配文本中的字符串
    ldm0
        23
    ldm0  
    OP
       1 天前
    @rainfox 我现在手上没有 Intel 的机器,不好测试。我找个虚拟机看看
    blushyes
        24
    blushyes  
       1 天前
    牛啊大佬,正好如快的 mac 的文件搜索还没实现,有空学习一下,让如快支持下 mac 的文件搜索。
    yuuluu
        25
    yuuluu  
    &nbs;  1 天前
    学习一下,先给一个 star
    avrillavigne
        26
    avrillavigne  
       1 天前 via Android
    小星星给你
    MzM2ODkx
        27
    MzM2ODkx  
       1 天前
    加颗星
    Dennmy
        28
    Dennmy  
       1 天前
    太支持了,不得不 star 了
    lekai63
        29
    lekai63  
       1 天前
    感谢分享!! 棒呆!
    SpringHack
        30
    SpringHack  
       1 天前
    围观
    Spxg
        31
    Spxg  
       1 天前 via iPhone
    太强了,已经在用了,很好用
    xlpxx
        32
    xlpxx  
       1 天前
    能加个英特尔版本的吗
    ldm0
        33
    ldm0  
    OP
       1 天前   1
    pinggaimuir384
        34
    pinggaimuir384  
       1 天前
    已 star
    rainfox
        35
    rainfox  
       21 小时 52 分钟前
    @ldm0 intel 版本,索引太慢了,半个小时了,还在索引
    prudence
        36
    prudence  
       15 小时 4 分钟前
    索引很慢,,上面也不少人说慢,,可以弄个类似索引开关 debug 看看正在索引什么呢 再或者以文件夹做计时器 大于几百毫秒或 1 秒的显示一下 我打开几十秒确实索引了 1000 多万 但是 1000 多万开始就慢了 1200w 到 1700w 花了七八分钟 还在索引
    xxnemesis1
        37
    xxnemesis1  
       13 小时 47 分钟前 via iPhone
    MacBook Air M4 ,114 万个文件,正在初始化了十多分钟,不知道什么情况
    xxnemesis1
        38
    xxnemesis1  
       13 小时 45 分钟前 via iPhone
    @xxnemesis1 二十分钟了,还在初始化…
    ldm0
        39
    ldm0  
    OP
       12 小时 58 分钟前
    正常百万级的文件索引是在 10 秒内完成的。
    索引逻辑是并行遍历文件系统(主要是 readdir),可能是访问某个文件夹阻塞了。
    主要问题在于我这边的几台机器,包括我朋友同事的机器索引都比较快无法复现这个问题,目前没有什么头绪。

    @xxnemesis1 @prudence @rainfox 有联系方式么,我可以单独出个 debug 包看看什么文件访问卡住了。我的 WX 是 TERNMjMzMzMzMw==
    MichaelChen007
        40
    MichaelChen007  
       12 小时 16 分钟前
    支持,但是我试了好几次,索引实在太卡了,一直没索引完。app store 有一个 profind ,不用索引,速度很快了。
    div id="r_16961036" class="cell">
    Mangozhen
        41
    Mangozhen  
       2 小时 40 分钟前
    @ldm0 #10 #10 OK 的,也许后面随着 APP 的完善,可以加上一些需求。
    Mangozhen
        42
    Mangozhen  
       2 小时 39 分钟前
    @rainfox #35 #35 APPLE Silicon 也是这样。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     953 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 23:04 PVG 07:04 LAX 15:04 JFK 18:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86