python – 通过_kMDItemUserTags或kMDItemOMUserTags在xattr中使用多个关键字

在重新组织我的图像时,为了预测OSX Mavericks,我正在编写一个脚本来将标签插入到我的图像文件的xattr字段中,因此我可以使用Spotlight搜索它们. (我也正在编辑EXIF以保证安全.)

我的问题是:

>哪个属性最好用? _kMDItemUserTags似乎是OSX版本,但是OpenMeta已经在使用kMDItemOMUserTags.理想情况下,我会喜欢Linux和OSX向前兼容的东西.
>如何设置多个标签?是逗号还是空格分隔还是其他什么?

作为一个例子,使用python xattr模块,我发出这些命令:

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

我也看到过这些标签的提及:kOMUserTags和kMDItemkeywords但不知道它们是否可能被实现……

编辑:进一步的调查显示,在10.8中可以搜索的东西,

>您需要使用com.apple.metadata作为kMD的前言:
>您必须进行十六进制编码或包裹在一个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]

我无法在具有可靠结果的文件夹上递归地工作.

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

>如您所知,标记被设置为属性列表编码的字符串数组.我不知道它是否是一个要求,但OS X以二进制格式编码属性列表,而不是像你那样用XML编码.

我调整了你的代码,使用二进制属性列表作为属性值,一切正常.这是我的代码.我使用的是双列表库,你可以通过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"])

使用标记测试文件和目录:< some_tag>在Spotlight中.

希望这可以帮助.

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

点赞