【问题标题】:Compound mdfind search复合 mdfind 搜索
【发布时间】:2017-08-28 22:07:36
【问题描述】:

目标是找到某个州或国家/地区的所有图像。

mdfind kind:image

将找到所有图像

mdfind "kMDItemCountry == 'United States'"

将找到所有具有此属性的文件。

mdfind kind:image "kMDItemCountry == 'United States'" 

失败。我尝试过使用 && 和 () 的各种分组,但无法使其工作。如何成功地将 'kind:image' 与 kMDIxxx 等属性搜索结合起来?

【问题讨论】:

  • 由于飓风,我已经离线好几天了。我找到了一个有效但不使用的答案 "kind:image" mdfind -onlyin ~ "(kMDItemContentTypeTree == 'image') && (kMDItemCountry == '*Georgia')"

标签: macos macos-sierra


【解决方案1】:

我有机会对 mdfind 的实际工作原理进行了一些实验,而不是它的记录方式 - 两者不同。

首先,让我们看看我的 Mac 上一个名为 tardis.png 的文件的 Spotlight 数据。

mdls tardis.png

输出

_kMDItemOwnerUserID            = 501
kMDItemBitsPerSample           = 32
kMDItemColorSpace              = "RGB"
kMDItemContentCreationDate     = 2017-05-31 14:15:03 +0000
kMDItemContentModificationDate = 2017-05-31 14:15:03 +0000
kMDItemContentType             = "public.png"
kMDItemContentTypeTree         = (
    "public.png",
    "public.item",
    "public.png",
    "public.data",
    "public.image",
    "public.content"
)
kMDItemCreator                 = "Adobe Photoshop CC 2017 (Macintosh)"
kMDItemDateAdded               = 2017-05-31 14:15:23 +0000
kMDItemDisplayName             = "tardis.png"
kMDItemFSContentChangeDate     = 2017-05-31 14:15:23 +0000
kMDItemFSCreationDate          = 2017-05-31 14:15:22 +0000
kMDItemFSCreatorCode           = "8BIM"
kMDItemFSFinderFlags           = 0
kMDItemFSHasCustomIcon         = (null)
kMDItemFSInvisible             = 0
kMDItemFSIsExtensionHidden     = 0
kMDItemFSIsStationery          = (null)
kMDItemFSLabel                 = 0
kMDItemFSName                  = "tardis.png"
kMDItemFSNodeCount             = (null)
kMDItemFSOwnerGroupID          = 20
kMDItemFSOwnerUserID           = 501
kMDItemFSSize                  = 1488497
kMDItemFSTypeCode              = "PNGf"
kMDItemHasAlphaChannel         = 0
kMDItemKind                    = "Portable Network Graphics image"
kMDItemLogicalSize             = 1488497
kMDItemOrientation             = 1
kMDItemPhysicalSize            = 1490944
kMDItemPixelCount              = 2091600
kMDItemPixelHeight             = 1494
kMDItemPixelWidth              = 1400
kMDItemProfileName             = "sRGB IEC61966-2.1"
kMDItemResolutionHeightDPI     = 72
kMDItemResolutionWidthDPI      = 72

这是一个匹配并列出该文件的查询:

mdfind -onlyin . "(kMDItemPixelHeight>1500 || kMDItemPixelWidth=1400)&& kMDItemKind='*image*' && kMDItemProfileName='srgb*'c"

这显示了如何使用 && (AND) 和 || (OR) 进行复合搜索,如何在括号 (conditionA || conditionB) 内对条件进行分组,以及如何进行不区分大小写的搜索(通过在后面附加 c搜索字符串)。


示例:也许更多供我自己参考;-)

列出我用来在我的 Mac 上拍照的所有相机和扫描仪:

mdfind -0 kind:image |  xargs -0 mdls -n kMDItemAcquisitionModel | sort -u
kMDItemAcquisitionModel = "645 PRO Mk III for iOS"
kMDItemAcquisitionModel = "BlackBerry 8900"
kMDItemAcquisitionModel = "BlackBerry 9000"
kMDItemAcquisitionModel = "Canon EOS 5D Mark III"
kMDItemAcquisitionModel = "Canon EOS 5D"
kMDItemAcquisitionModel = "Canon EOS 7D Mark II"
kMDItemAcquisitionModel = "Canon EOS 7D"
kMDItemAcquisitionModel = "Canon EOS-1D Mark II N"
kMDItemAcquisitionModel = "Canon EOS-1D Mark IV"
kMDItemAcquisitionModel = "Canon EOS-1D X"
kMDItemAcquisitionModel = "Canon EOS-1DS"
kMDItemAcquisitionModel = "Canon EOS-1Ds Mark II"
kMDItemAcquisitionModel = "Canon EOS-1Ds Mark III"
kMDItemAcquisitionModel = "EOS-1Ds Mark III"
kMDItemAcquisitionModel = "EPSON Perfection 4990"
kMDItemAcquisitionModel = "NIKON D800"
kMDItemAcquisitionModel = "NIKON D800E"
kMDItemAcquisitionModel = "Perfection 4990"
kMDItemAcquisitionModel = "Perfection4990"
kMDItemAcquisitionModel = "PerfectionV700  "
kMDItemAcquisitionModel = "PerfectionV700"
kMDItemAcquisitionModel = "TANGO           "
kMDItemAcquisitionModel = "TANGO"
kMDItemAcquisitionModel = "iPad mini 4"
kMDItemAcquisitionModel = "iPad mini"
kMDItemAcquisitionModel = "iPad"
kMDItemAcquisitionModel = "iPhone 3G"
kMDItemAcquisitionModel = "iPhone 3GS"
kMDItemAcquisitionModel = "iPhone 4"
kMDItemAcquisitionModel = "iPhone 4S"
kMDItemAcquisitionModel = "iPhone 5"
kMDItemAcquisitionModel = "iPhone 5s"
kMDItemAcquisitionModel = "iPhone 6"
kMDItemAcquisitionModel = "iPhone 6s"
kMDItemAcquisitionModel = "iPhone SE"
kMDItemAcquisitionModel = "iPhone"

查找在 iPhone 6 上拍摄的所有照片:

mdfind "kMDItemAcquisitionModel='*iPhone*6*'"

注意事项

  • 手册页说-onlyin 将搜索范围限制在指定目录。这并不正确,因为它也递归到包含的目录中。

  • 在比较中使用单 (=) 或双 (==) 等号似乎没有区别。

  • 文档说您可以使用string==[c]"pattern" 进行不区分大小写的搜索,这是不正确的,我上面显示的语法至少在 macOS Sierra 上有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2013-07-07
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多