用 Spotlight 元数据索引快速查找文件,适合全盘按名称或内容搜索。
mdfind 查询的是 Spotlight 的中央元数据存储,而不是实时遍历文件系统。它速度快、能按内容或元数据字段筛选,但前提是目标卷已建立索引且文件没有被排除。默认查询把字符串当作元数据值匹配;写 kMDItemFSName == "*.pdf"c 这类表达式可以精确控制字段,后缀 c 表示不区分大小写,w 表示按词匹配。它是 macOS 专有工具,Linux 没有 GNU 对应物,跨平台脚本通常用 find 或 locate 分支处理。
常用选项:-onlyin 目录 限定范围,-name 文件名 只匹配名称,-literal 强制按字面查询,-interpret 按 Spotlight 菜单的规则解释,-count 只输出数量,-0 用 NUL 分隔结果,-live 持续输出匹配数量变化。配合 mdls 可以查看某个文件实际有哪些可查询字段。
索引状态用 mdutil -s / 查看;mdutil -i off 会关闭索引,mdutil -E 会重建索引。系统设置里的“聚焦隐私”列表、未挂载的外接卷、以及部分系统目录不会被搜索到。mdfind 找不到文件不等于文件不存在,只说明索引里没有匹配项。
# 只在文档目录找 PDF,文件名匹配且不区分大小写
% mdfind -onlyin ~/Documents 'kMDItemFSName == "*.pdf"c'
# 按名称快速查找,适合不知道文件在哪一块盘
% mdfind -name "invoice"
# 只统计图片数量,不输出路径
% mdfind -count 'kMDItemContentType == "public.image"'
# 最近七天修改过的文件
% mdfind 'kMDItemFSContentChangeDate >= $time.today(-7)'
# 结果用 NUL 分隔,安全处理带空格的文件名
% mdfind -0 'kMDItemFSName == "*.mov"c' | xargs -0 du -h
# 先确认索引状态,再查看某文件的元数据字段
% mdutil -s /
% mdls -name kMDItemFSName -name kMDItemContentType ~/Documents/report.pdf
mdfind 返回空结果不一定是查询写错,先看 mdutil -s / 是否显示 Indexing enabled,再用 mdls 文件 确认该文件已被索引。mdutil -s /Volumes/盘名 检查;需要时用 sudo mdutil -i on /Volumes/盘名 开启,首次索引会很耗 I/O。== 都是语法的一部分,被 shell 吃掉后会退化成全文搜索。整段查询用单引号包住。-name 只匹配文件名,不搜索正文;找内容用 kMDItemTextContent == "*关键词*"c,但只有被索引的文本类型才有效。-0 配合 xargs -0 或 while IFS= read -r -d ''。mdfind 的结果证明某文件“不存在”。find — 实时遍历,能查到未索引文件。xattr — 查看 Spotlight 之外的文件扩展属性。ls — 确认结果路径确实存在。find 速查 — 与 find 的选用场景对照。find — Linux 下的实时查找方式。合上页面,先回答,再展开对照。
mdfind 可能找不到一个确实存在的文件?-onlyin 和 -name 各自限制什么?mdfind 结果时为什么推荐 -0?mdutil -s 和 mdls 验证。-onlyin 限定搜索目录,-name 只匹配文件名而不搜索其他元数据或正文。xargs -0 等工具处理。
小程序版
微信扫码,随时查命令