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

tru*_*ess 6 macos bash terminal

在终端我mdfind 'kMDItemFSLabel = 6'用来在我的Mac上找到带有红色文件标签的所有内容.但是,它似乎是用红色标签排除文件夹.我试图让它也返回文件夹,但我似乎甚至无法获得任何这些仅限文件夹的查询工作,更不用说将其添加到当前文件结果.mdfind kind:folders并且mdfind '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
Run Code Online (Sandbox Code Playgroud)

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

什么是正确的语法?

一旦我做对了,我怎么说"文件夹和所有文件"?像'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
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 11

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

如果有人知道如何正确地调用这两个语言,请让我知道.

警告: 这两种语言不能混用 - 给定的查询字符串必须使用一种或另一种语法.

以下解决方案相应地标记为SLFL.鉴于SL使用本地化名称,我建议使用SL解决方案来获得可预测的,与语言环境无关的结果,尽管它更复杂和冗长.


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


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


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


使用的一般提示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日

  • 关于文件元数据查询
    • 查询表达式语法 - 仅FL
      • 警告:cd选项为需要追加到解释操作[c][d],而不是在(右手边)操作,这是当你保存交互构建查询什么OSX本身并没有; 同时,至少在其他选项退出这还没有提到:w; 如果您将一个或多个选项字母附加到带引号的字符串,其含义如下
      • c ...匹配案例 - 不敏感
      • d ...匹配时忽略变音符号(外来字符的基本字母上方和下方的标记)
      • w ...匹配整个单词(从我能说的)
      • 您还可以使用熟悉的*(任何字符序列)和?(一个字符)通配符.
    • 常见元数据属性列表- 仅限FL
      • 请注意,由于Spotlight可以使用插件进行扩展,因此任何给定的计算机都可能具有其他属性.要查看文件类型到属性的映射,请运行mdimport -X并查看Types密钥的条目.

总而言之,从OSX 10.10.3开始,mdfindSpotlight查询语言记录不完整,挑剔的野兽 - 审判和错误往往是你最好的朋友,遗憾的是.