系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

mdfind

用 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

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 为什么 mdfind 可能找不到一个确实存在的文件?
  2. -onlyin 和 -name 各自限制什么?
  3. 脚本处理 mdfind 结果时为什么推荐 -0?
答案
  1. 文件所在卷未索引、被隐私列表排除或索引尚未完成;用 mdutil -s 和 mdls 验证。
  2. -onlyin 限定搜索目录,-name 只匹配文件名而不搜索其他元数据或正文。
  3. 文件名可能含换行,NUL 分隔才能安全交给 xargs -0 等工具处理。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令