6

在重新组织我的图像时,为了期待 OSX Mavericks,我正在编写一个脚本来将标签插入到xattr我的图像文件的字段中,这样我就可以使用 Spotlight 搜索它们。(为了安全起见,我也在编辑 EXIF。)

我的问题是:

  1. 哪个属性最好用?_kMDItemUserTags似乎是 OSX 版本,但kMDItemOMUserTags已被 OpenMeta 使用。理想情况下,我希望能够与 Linux 和 OSX 前向兼容。

  2. 如何设置多个标签?是逗号或空格分隔还是其他?

例如,使用 pythonxattr模块,我发出这些命令:

xattr.setxattr(FileName, "_kMDItemUserTags", "Name - Sample")
xattr.setxattr(FileName, "kMDItemOMUserTags", "Name,Institution,Sample")

我也看到提到这些标签:kOMUserTagskMDItemkeywords不知道它们是否可能被实施......

编辑:进一步调查表明,对于 10.8 中可搜索的内容,

  • 您需要在 kMD 前面加上 com.apple.metadata:
  • 您必须进行十六进制编码或包装在 plist 中。

此 python 代码将为 kMDItemFinderComment 生成标签,该标签可在聚光灯下搜索...

def writexattrs(F,TagList):

    """ writexattrs(F,TagList):
    writes the list of tags to three xattr field:
    'kMDItemFinderComment','_kMDItemUserTags','kMDItemOMUserTags'
       This version uses the xattr library """

    plistFront = '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><array>'
    plistEnd = '</array></plist>'
    plistTagString = ''
    for Tag in TagList:
        plistTagString = plistTagString + '<string>{}</string>'.format(Tag)
    TagText = plistFront + plistTagString + plistEnd

    OptionalTag = "com.apple.metadata:"
    XattrList = ["kMDItemFinderComment","_kMDItemUserTags","kMDItemOMUserTags"]
    for Field in XattrList:
        xattr.setxattr (F,OptionalTag+Field,TagText.encode('utf8'))
            # Equivalent shell command is xattr -w com.apple.metadata:kMDItemFinderComment [PLIST value] [File name]

我无法让它在具有可靠结果的文件夹上递归工作。

4

1 回答 1

3
  1. 如果您担心兼容性,则必须同时设置属性_kMDItemUserTagskMDItemOMUserTags. 我认为没有不同的解决方案,因为所有新的 OS X 应用程序都将使用前一个属性,而旧应用程序仍然使用后者。这只是我的猜测,但我猜 OpenMeta 最终会停止使用新的原生 API。展望未来,_kMDItemUserTags即使在 Linux 环境中,您也可以为新的应用程序/脚本使用该属性。

  2. 如您所见,标签被设置为属性列表编码的字符串数组。我不知道这是否是一项要求,但 OS X 以二进制格式而不是像您那样以 XML 编码属性列表。

我调整了您的代码以使用二进制属性列表作为属性值,并且一切正常。这是我的代码。我正在使用你可以使用的 biplist 库easy_install biplist

import xattr
import biplist

def write_xattr_tags(file_path, tags):
    bpl_tags = biplist.writePlistToString(tags)
    optional_tag = "com.apple.metadata:"
    map(lambda a: xattr.setxattr(file_path, optional_tag + a, bpl_tags),
        ["kMDItemFinderComment", "_kMDItemUserTags", "kMDItemOMUserTags"])

tag:<some_tag>在 Spotlight 中使用文件和目录进行了测试。

希望这可以帮助。

  • 注意:我在这个答案中使用的是 OS X Lion,但它应该可以在 Mavericks 上运行而没有任何问题。
  • 编辑:如果要将标签应用于目录的内容,则必须为每个文件单独完成,因为 xattr python 模块没有递归选项。
于 2013-10-23T19:36:43.577 回答