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

时间:2015-05-16 02:46:45

标签: macos bash terminal

在终端我正在使用mdfind 'kMDItemFSLabel = 6'在我的Mac上查找带有红色文件标签的所有内容。但是,它似乎是用红色标签排除文件夹。我试图让它也返回文件夹,但我似乎甚至无法让任何这些仅限文件夹的查询工作,更不用说将其添加到当前文件结果中了。 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]

正确的语法是什么?

一旦我说得对,我怎么说'#34;文件夹和所有文件"?像善良:文件夹+所有'?

编辑:也尝试过:

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

2 个答案:

答案 0 :(得分:10)

<强> 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对的 简化,LOCALIZED 语言
    • 基于简化,本地化属性名称,仅包含所有属性的 子集 (但是,或者,您可以使用完整的,与语言环境无关的属性名称)
      • 某些属性也已本地化;例如,属性kindkMDItemKind)明确设计为报告本地化值
    • 基于简化的匹配规则
    • 与布尔运算符AND(默认值),ORNOT结合使用(请注意,这些已本地化)。
  • FL - 灵活语言功能更强大且与语言环境无关,但更复杂,更冗长的语言
    • 基于与语言环境无关的基础属性名称
    • 使用一系列关系运算符
    • 具有更灵活的价值匹配选项
    • 与布尔运算符&&(默认值),||!
    • 结合使用

如果有人知道正确地打电话给这两种语言,请告诉我。

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

以下解决方案相应地标记为 SL FL 。 鉴于SL使用本地化的名称,我建议将SL解决方案用于可预测的,与语言环境无关的结果,尽管它更复杂,更详细。

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

  • FL:

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

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

要查找使用红色文件/文件夹标签标记的文件 (而不是文件夹),请使用:

  • FL:

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

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

要查找使用红色文件/文件夹标签标记的文件夹 (而不是文件),请使用:

  • FL:

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

    mdfind 'tag:red AND kind:folder'
    

使用mdfind 的一般提示:

  • 将查询作为一个单引号字符串传递,以保护它免受 shell 的解释(如上所述)。
  • 如果您不确定如何制定查询:
    • 通过Finder的搜索字段以交互方式创建所需的查询(从弹出式列表中开始输入并选择查询字段,或按右上角的+用于在弹出列表的帮助下逐行创建多个AND组合标准)
    • 将其保存到*.savedSearch文件(右上角的Save按钮,默认情况下会保存到~/Library/Saved Searches/
    • 并打开该文件的Inspector窗口并查看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选项被解释为需要作为[c]附加到运算符和{ {1}},而不是(右侧)操作数,这是OSX在保存交互式构造的查询时所执行的操作;另外,至少在其他选项出口上,甚至没有提到:[d];如果您将一个或多个选项字母附加到带引号的字符串,其含义如下
      • w ...匹配案例 - 不敏感
      • c ...在匹配时忽略变音符号(在外国字符的基本字母上方和下方标记)
      • d ...匹配整个单词(从我能说的)
      • 您还可以使用熟悉的w(任何字符序列。)和*(一个字符。)通配符。
    • List of common Metadata Attributes - FL ONLY
      • 请注意,由于Spotlight可以使用插件进行扩展,因此任何给定的计算机都可能具有其他属性;要查看文件类型到属性的映射,请运行?并查看mdimport -X键的条目。

总而言之,从OSX 10.10.3起,Types和Spotlight查询语言记录不足,挑剔的野兽 - 遗憾的是,试错通常是你最好的朋友。 / p>

答案 1 :(得分:1)

以下似乎有效:

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

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