在终端中,我使用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
我得到的只是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
tl;dr
使用以下与区域设置无关的命令:
- 文件和文件夹:
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'
有关背景信息,请继续阅读。
事实证明,聚光灯和mdfind
说两种不同的语言:
-
SL-简单语言:基于
<attribName>:<attribVal
对的简化、本地化语言- 基于简化的本地化属性名称,仅包含所有属性的子集(但是,您也可以使用完整的、与区域设置无关的属性名称)
- 一些属性值也被本地化;例如,属性
kind
(kMDItemKind
)被明确设计为报告本地化值
- 一些属性值也被本地化;例如,属性
- 基于简化的匹配规则
- 与布尔运算符
AND
(默认值)、OR
和NOT
相结合(请注意,这些运算符不会被本地化)
- 基于简化的本地化属性名称,仅包含所有属性的子集(但是,您也可以使用完整的、与区域设置无关的属性名称)
-
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
的常规提示:
- 将查询作为一个单引号字符串传递,以保护其不受外壳的解释(如上所述)
- 如果您不确定如何制定查询:
- 通过Finder的搜索字段交互式创建所需查询(开始键入并从弹出列表中选择查询字段,或在弹出列表的帮助下按右上角的
+
逐行创建多个and组合条件) - 保存到一个
*.savedSearch
文件(右上角的Save
按钮,默认保存到~/Library/Saved Searches/
) - 打开该文件的Inspector窗口并查看
Query:
字段 - 请注意,此类系统创建的查询始终使用FL语言
- 通过Finder的搜索字段交互式创建所需查询(开始键入并从弹出列表中选择查询字段,或在弹出列表的帮助下按右上角的
- 要查看所有支持的元数据属性的列表及其描述,请检查
mdimport -A
的输出。- 第1列包含FL属性名称
- 第4列包含SL属性名称(简化、本地化)
- 要将匹配项限制为特定文件夹的子树,请使用
-onlyin <folder>
选项 - 要在匹配路径之后输出特定元数据属性的值,请使用一个或多个
-attr <attribName>
选项
文档:
注意:文档严重不足,部分内容不正确 截至2015年5月16日
- 关于文件元数据查询
- 查询表达式语法-仅限FL
- 注意事项:
c
和d
选项被解释为需要作为[c]
和[d]
附加到运算符,而不是(右侧)操作数(这是OSX在保存交互式构造的查询时所做的操作);此外,至少在其他选项出口上,甚至没有提到:w
;如果将一个或多个选项字母附加到带引号的字符串中,其含义如下 c
。。。INsensitive匹配大小写d
。。。匹配时忽略变音符号(外国字符基字母上方和下方的标记)w
。。。作为一个整体匹配(据我所知)- 您还可以使用熟悉的
*
(任意字符序列)和?
(一个字符)通配符
- 注意事项:
-
常见元数据属性列表-仅限FL
- 注意,由于Spotlight可以通过插件进行扩展,任何给定的机器都可能具有额外的属性;要查看文件类型到属性的映射,请运行
mdimport -X
并查看Types
键的条目
- 注意,由于Spotlight可以通过插件进行扩展,任何给定的机器都可能具有额外的属性;要查看文件类型到属性的映射,请运行
总而言之,从macOS 10.10.3开始,mdfind
和聚光灯查询语言的文档记录很差,挑剔的野兽-遗憾的是,试错往往是你最好的朋友。
以下似乎有效:
mdfind 'kMDItemContentType = "public.folder" && kMDItemUserTags = "Red"cd'
顺便说一句,"Red"
末尾的cd
意味着匹配应该忽略大小写(大写与小写)和变音标记(重音符号等)