文件元數(shù)據(jù)查詢表達(dá)式語(yǔ)法
文件元數(shù)據(jù)查詢是使用作為謂詞字符串格式的子集的查詢語(yǔ)言構(gòu)建的。元數(shù)據(jù)搜索表達(dá)式語(yǔ)法允許應(yīng)用程序“動(dòng)態(tài)的”構(gòu)建搜索,允許高級(jí)用戶構(gòu)建他們自己的查詢。語(yǔ)法相對(duì)簡(jiǎn)單,包括比較、語(yǔ)言類(lèi)型以及時(shí)間和日期變量。通過(guò)NSPredicate類(lèi)構(gòu)建
比較語(yǔ)法
文件元數(shù)據(jù)查詢表達(dá)式語(yǔ)法是 shell 用戶熟悉的文件名通配的簡(jiǎn)化形式。查詢具有以下格式:
attribute == value
其中attribute是標(biāo)準(zhǔn)元數(shù)據(jù)屬性(請(qǐng)參閱“文件元數(shù)據(jù)屬性參考”)或?qū)胝咦远x的元數(shù)據(jù)屬性。
例如,要在 Spotlight 中查詢由“Steve”創(chuàng)作的所有文件,查詢將如下所示:
kMDItemAuthors ==[c] "史蒂夫"
表 3-1中列出了可用的比較運(yùn)算符。
| 操作員 | 描述 |
|---|---|
== |
平等的 |
!= |
不相等 |
< |
小于(僅適用于數(shù)值和日期) |
> |
大于(僅適用于數(shù)值和日期) |
<= |
小于或等于(僅適用于數(shù)值和日期) |
>= |
大于或等于(僅適用于數(shù)值和日期) |
InRange(attributeName,minValue,maxValue) |
指定 attributeName 中 minValue 到 maxValue 范圍內(nèi)的數(shù)值 |
值字符串中的“和‘字符應(yīng)使用該``字符進(jìn)行轉(zhuǎn)義。
示例中的搜索值具有修飾符“ c”。這些修飾符指定了如何進(jìn)行比較。
表 3-2描述了可用的比較修飾符。
搜索修飾符應(yīng)緊跟在比較運(yùn)算符之后并用方括號(hào)括起來(lái)[…]。
| 修飾符 | 描述 |
|---|---|
c |
比較不區(qū)分大小寫(xiě)。 |
d |
比較對(duì)變音符號(hào)不敏感。 |
表 3-3顯示了幾個(gè)使用比較修飾符的示例。
| 請(qǐng)求參數(shù) | 結(jié)果 |
|---|---|
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" |
無(wú)論單詞大小寫(xiě)如何,都匹配“Frédéric”和“Frederic”。 |
使用通配符 (*和?) 可以匹配字符串開(kāi)頭、字符串結(jié)尾或字符串內(nèi)任何位置的子字符串。表 3-4顯示了幾種常見(jiàn)用法。
的*字符的多個(gè)字符相匹配,而?通配符匹配單個(gè)字符。
| 請(qǐng)求參數(shù) | 結(jié)果 |
|---|---|
kMDItemTextContent == "paris*" |
匹配以“paris”開(kāi)頭的屬性值。例如,匹配“paris”,但不匹配“comparison”。 |
kMDItemTextContent == "*paris" |
匹配以“paris”結(jié)尾的屬性值。 |
kMDItemTextContent == "*paris*" |
匹配值中任何位置包含“paris”的屬性。例如,匹配“paris”和“comparison”。 |
kMDItemTextContent == "paris" |
匹配完全等于“paris”的屬性值。 |
可以使用AND( &&) 和OR( ||)的類(lèi) C 語(yǔ)法組合查詢。例如,要將查詢限制為由“Steve”創(chuàng)作的音頻文件,查詢將是:
kMDItemAuthors ==[c] "Steve" && kMDItemContentType == "public.audio"
括號(hào)可用于進(jìn)一步分組查詢匹配。例如,要搜索由“Steve”或“Daniel”創(chuàng)作的音頻文件,查詢將是:
(kMDItemAuthors ==[c] "Daniel" || kMDItemAuthors[c] == "Steve") && kMDItemContentType == "public.audio"
您可以使用以下查詢擴(kuò)展此搜索以包括視頻文件:
(kMDItemAuthors ==[c] "Daniel" || kMDItemAuthors ==[c] "Steve" ) && (kMDItemContentType == "public.audio" || kMDItemContentType == "public.video")
時(shí)間和日期變量
您還可以創(chuàng)建使用日期和時(shí)間作為搜索值的查詢。日期和時(shí)間值被格式化為與 CFDate 兼容的浮點(diǎn)值,秒相對(duì)于 2001 年 1 月 1 日。
此外,$time還提供了可用于指定相對(duì)于當(dāng)前時(shí)間的值的變量,如表 3-5所示。
| 時(shí)間變量 | 描述 |
|---|---|
$time.now |
當(dāng)前日期和時(shí)間。 |
$time.today |
當(dāng)前日期。 |
$time.yesterday |
昨天的日期。 |
$time.this_week(-1) |
前一周的日期。 |
$time.this_week |
當(dāng)前周中的日期。 |
$time.this_month |
當(dāng)前月份的日期。 |
$time.this_year |
當(dāng)前年份中的日期。 |
$time.now(NUMBER) |
通過(guò)向當(dāng)前時(shí)間添加正值或負(fù)值(以秒為單位)的日期和時(shí)間。 |
$time.today(NUMBER) |
通過(guò)將正值或負(fù)值(以天為單位)添加到當(dāng)前日期的日期 |
$time.this_week(NUMBER) |
通過(guò)將正值或負(fù)值(以周為單位)添加到當(dāng)前周來(lái)確定日期。 |
$time.this_month(NUMBER) |
通過(guò)將正值或負(fù)值(以月為單位)添加到當(dāng)前月來(lái)確定日期。 |
$time.this_year(NUMBER) |
通過(guò)將正值或負(fù)值(以年為單位)添加到當(dāng)前年份來(lái)確定日期。 |
$time.iso(ISO-8601-STR) |
通過(guò)解析指定的 ISO-8601-STR 兼容字符串的日期。 |
使用該$time變量,您可以使用以下查詢限制搜索以僅查找上周已更改的文件:
((kMDItemAuthors ==[c] "Daniel" || kMDItemAuthors[c] == "Steve") && (kMDItemContentType == "public.audio" || kMDItemContentType == "public.video")) && (kMDItemFSContentChangeDate == $time.this_week(-1))
注意: $time變量的值是在第一次執(zhí)行查詢時(shí)設(shè)置的。隨著查詢繼續(xù)運(yùn)行,它不會(huì)更新到當(dāng)前時(shí)間。
\