除了文件之外,如何让 mdfind 包含文件夹匹配项?

How do I get mdfind to include folder matches in addition to files?

在终端中,我正在使用 mdfind 'kMDItemFSLabel = 6' 查找 Mac 上带有红色文件标签的所有内容。但是,它似乎排除了带有红色标签的文件夹。我试图让它也变成 return 文件夹,但我似乎无法让这些仅文件夹查询中的任何一个工作,更不用说将它添加到当前文件结果中了。 mdfind kind:foldersmdfind 'kMDItemFSLabel=6' 独立工作,但我不知道如何同时获得:

mdfind kind:folders AND 'kMDItemFSLabel == 6'
mdfind 'kind:folders' AND 'kMDItemFSLabel == 6'
mdfind 'kind:folders kMDItemFSLabel == 6'
mdfind kind:folders kMDItemFSLabel == 6
etc

我得到的只是Failed to create query for [query above]

正确的语法是什么?

一旦我说对了,我怎么说 "folders AND all files"?类似 `kind:folders+all'?

编辑:也试过:

mdfind kind:folders && 'kMDItemFSLabel == 6'   returns every folder on my computer
mdfind kind:folders && kMDItemFSLabel == 6   returns every folder on my computer
mdfind 'kind:folders' && 'kMDItemFSLabel == 6' returns every folder on my computer
mdfind 'kind:folders && kMDItemFSLabel == 6'   failed to create query

以下似乎有效:

mdfind 'kMDItemContentType = "public.folder" && kMDItemUserTags = "Red"cd'

顺便说一句,"Red" 末尾的 cd 表示匹配应忽略大小写(大写与小写)和变音符号(重音等)。

tl;博士

使用以下 区域设置无关的 命令:

  • 个文件 个文件夹:
    • mdfind 'kMDItemUserTags == Red'
  • 文件 :
    • mdfind 'kMDItemUserTags == Red && ! kMDItemContentType == public.folder'
  • 文件夹
    • mdfind 'kMDItemUserTags == Red && kMDItemContentType == public.folder'

更简单,但 区域特定 等价物 - 这些示例仅适用于英语语言环境并且必须本地化才能与其他语言环境一起工作:

  • 个文件 个文件夹:
    • mdfind 'tag:red'
  • 文件 :
    • mdfind 'tag:red AND NOT kind:folder'
  • 文件夹
    • mdfind 'tag:red AND kind:folder'

有关背景信息,请继续阅读。


事实证明,Spotlight - 因此 mdfind - 会说两种不同的语言:

  • SL - 简单语言:一种简化的本地化语言基于<attribName>:<attribVal
    • 基于简化,本地化属性名称仅包含一个子集 的所有属性 (但是,您也可以 使用完整的、与语言环境无关的属性名称)
      • 某些属性 也已本地化;例如,属性 kind(kMDItemKind) 明确设计用于报告本地化值
    • 基于简化的匹配规则
    • 结合布尔运算符 AND(默认)、ORNOT(请注意,这些 不会 本地化)。
  • FL - 灵活的语言:一种更强大且独立于语言环境,但更复杂和冗长的语言
    • 基于 独立于语言环境的底层属性名称
    • 使用一系列关系运算符
    • 具有更灵活的价值匹配选项
    • 结合布尔运算符 &&(默认)、||!

如果有人知道如何正确调用这两种语言,请告诉我。

警告: 这两种语言不能混合使用 - 给定的查询字符串必须使用其中一种语法。

下面的解决方案相应地用 SLFL 标记。 鉴于 SL 使用 localized 名称,我建议使用 SL 解决方案以获得可预测的、与区域设置无关的结果,尽管它更复杂和冗长。


要查找所有文件文件夹用红色标签标记,使用:

  • FL:

      mdfind 'kMDItemUserTags == Red'
    
  • SL(英语):

      mdfind 'tag:red' # in German, `tag:red` would be `attribut:red`
    

仅查找文件(与文件夹相对)红色file/folder标签,使用:

  • FL:

      mdfind 'kMDItemUserTags == Red && ! kMDItemContentType == public.folder'
    
  • SL(英语):

      mdfind 'tag:red AND NOT kind:folder' # in German, `kind:folder` would be `art:ordner`
    

仅查找文件夹(与文件相对)红色file/folder标签,使用:

  • FL:

      mdfind 'kMDItemUserTags == Red && kMDItemContentType == public.folder'
    
  • SL(英语):

      mdfind 'tag:red AND kind:folder'
    

一般使用mdfind的提示:

  • 将查询作为一个 单引号 字符串 传递,以保护它免受 的解释shell(同上)
  • 如果您不确定如何制定查询:
    • 通过 Finder 的搜索字段交互式 创建所需的查询(开始键入并从弹出列表中 select 查询字段,或按 +用于在弹出列表的帮助下逐行创建多个 AND 组合条件的右上角)
    • 保存到*.savedSearch文件(右上角的Save按钮,默认保存到~/Library/Saved Searches/),
    • 并为该文件打开检查器 window 并查看 Query: 字段。
    • 请注意,此类系统创建的查询始终使用 FL 语言。
  • 要查看 所有支持的元数据属性 及其描述的列表,请检查 mdimport -A 的输出。
    • 第 1 列包含 FL 属性名称。
    • 第 4 列包含 SL 属性名称(简化、本地化)。
  • 要将匹配限制到特定文件夹的子树,请使用 -onlyin <folder> 选项。
  • 要在匹配路径后输出特定元数据属性的值,请使用一个或多个 -attr <attribName> 选项。

文档:

注意:文档严重缺乏,并且部分不正确。截至 2015 年 5 月 16 日

  • About File Metadata Queries
  • Query expression syntax - FL ONLY
    • 警告: cd 选项被解释为需要附加到 operator作为 [c][d],与(右侧) 操作数 相对,这是 OSX 本身在您交互式保存时所做的构造查询;另外,至少在其他甚至没有提到的选项退出上:w;如果在带引号的字符串后附加一个或多个选项字母,它们的含义如下
    • c ... 区分大小写匹配
    • d ...匹配时忽略变音符号(外文基本字母上方和下方的标记)
    • w ... 整个单词匹配(据我所知)
    • 您还可以使用熟悉的 *(任何字符序列。)和 ?(一个字符。)通配符。
  • List of common Metadata Attributes - FL ONLY
    • 请注意,由于 Spotlight 可以使用插件进行扩展,因此任何给定的机器都可能具有其他属性;要查看文件类型到属性的映射,运行 mdimport -X 并查看 Types 键的条目。

总而言之,从 macOS 10.10.3 开始,mdfind 和 Spotlight 查询语言的文档很少,挑剔的野兽 - 反复试验通常是最好的朋友们,很遗憾。