文件元数据查询表达式语法
文件元数据查询是使用作为谓词字符串格式的子集的查询语言构建的。元数据搜索表达式语法允许应用程序“动态的”构建搜索,允许高级用户构建他们自己的查询。语法相对简单,包括比较、语言类型以及时间和日期变量。通过NSPredicate类
构建
比较语法
文件元数据查询表达式语法是 shell 用户熟悉的文件名通配的简化形式。查询具有以下格式:
attribute == value
其中attribute
是标准元数据属性(请参阅“文件元数据属性参考”)或导入者自定义的元数据属性。
例如,要在 Spotlight 中查询由“Steve”创作的所有文件,查询将如下所示:
kMDItemAuthors ==[c] "史蒂夫"
表 3-1中列出了可用的比较运算符。
操作员 | 描述 |
---|---|
== |
平等的 |
!= |
不相等 |
< |
小于(仅适用于数值和日期) |
> |
大于(仅适用于数值和日期) |
<= |
小于或等于(仅适用于数值和日期) |
>= |
大于或等于(仅适用于数值和日期) |
InRange(attributeName,minValue,maxValue) |
指定 attributeName 中 minValue 到 maxValue 范围内的数值 |
值字符串中的“
和‘
字符应使用该``字符进行转义。
示例中的搜索值具有修饰符“ c
”。这些修饰符指定了如何进行比较。
表 3-2描述了可用的比较修饰符。
搜索修饰符应紧跟在比较运算符之后并用方括号括起来[…]
。
修饰符 | 描述 |
---|---|
c |
比较不区分大小写。 |
d |
比较对变音符号不敏感。 |
表 3-3显示了几个使用比较修饰符的示例。
请求参数 | 结果 |
---|---|
kMDItemTextContent == "Paris" |
匹配“Paris”但不匹配“paris”。 |
kMDItemTextContent ==[c] "Paris" |
匹配“巴黎”和“巴黎”。 |
kMDItemTextContent ==[c] "*Paris*" |
匹配“Paris”、“paris”、“I love Paris”和“paris-france.jpg”。 |
kMDItemTextContent == "Frédéric" |
匹配“Frédéric”但不匹配“Frederic”。 |
kMDItemTextContent ==[d] "Frédéric" |
无论单词大小写如何,都匹配“Frédéric”和“Frederic”。 |
使用通配符 (*
和?
) 可以匹配字符串开头、字符串结尾或字符串内任何位置的子字符串。表 3-4显示了几种常见用法。
的*
字符的多个字符相匹配,而?
通配符匹配单个字符。
请求参数 | 结果 |
---|---|
kMDItemTextContent == "paris*" |
匹配以“paris”开头的属性值。例如,匹配“paris”,但不匹配“comparison”。 |
kMDItemTextContent == "*paris" |
匹配以“paris”结尾的属性值。 |
kMDItemTextContent == "*paris*" |
匹配值中任何位置包含“paris”的属性。例如,匹配“paris”和“comparison”。 |
kMDItemTextContent == "paris" |
匹配完全等于“paris”的属性值。 |
可以使用AND
( &&
) 和OR
( ||
)的类 C 语法组合查询。例如,要将查询限制为由“Steve”创作的音频文件,查询将是:
kMDItemAuthors ==[c] "Steve" && kMDItemContentType == "public.audio"
括号可用于进一步分组查询匹配。例如,要搜索由“Steve”或“Daniel”创作的音频文件,查询将是:
(kMDItemAuthors ==[c] "Daniel" || kMDItemAuthors[c] == "Steve") && kMDItemContentType == "public.audio"
您可以使用以下查询扩展此搜索以包括视频文件:
(kMDItemAuthors ==[c] "Daniel" || kMDItemAuthors ==[c] "Steve" ) && (kMDItemContentType == "public.audio" || kMDItemContentType == "public.video")
时间和日期变量
您还可以创建使用日期和时间作为搜索值的查询。日期和时间值被格式化为与 CFDate 兼容的浮点值,秒相对于 2001 年 1 月 1 日。
此外,$time
还提供了可用于指定相对于当前时间的值的变量,如表 3-5所示。
时间变量 | 描述 |
---|---|
$time.now |
当前日期和时间。 |
$time.today |
当前日期。 |
$time.yesterday |
昨天的日期。 |
$time.this_week(-1) |
前一周的日期。 |
$time.this_week |
当前周中的日期。 |
$time.this_month |
当前月份的日期。 |
$time.this_year |
当前年份中的日期。 |
$time.now(NUMBER) |
通过向当前时间添加正值或负值(以秒为单位)的日期和时间。 |
$time.today(NUMBER) |
通过将正值或负值(以天为单位)添加到当前日期的日期 |
$time.this_week(NUMBER) |
通过将正值或负值(以周为单位)添加到当前周来确定日期。 |
$time.this_month(NUMBER) |
通过将正值或负值(以月为单位)添加到当前月来确定日期。 |
$time.this_year(NUMBER) |
通过将正值或负值(以年为单位)添加到当前年份来确定日期。 |
$time.iso(ISO-8601-STR) |
通过解析指定的 ISO-8601-STR 兼容字符串的日期。 |
使用该$time
变量,您可以使用以下查询限制搜索以仅查找上周已更改的文件:
((kMDItemAuthors ==[c] "Daniel" || kMDItemAuthors[c] == "Steve") && (kMDItemContentType == "public.audio" || kMDItemContentType == "public.video")) && (kMDItemFSContentChangeDate == $time.this_week(-1))
注意: $time
变量的值是在第一次执行查询时设置的。随着查询继续运行,它不会更新到当前时间。
\