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

Python 通过_kMDItemUserTags或kMDItemOMUserTags在xattr中使用多个关键字,python,macos,spotlight,osx-mavericks,xattr,Python,Macos,Spotlight,Osx Mavericks,Xattr,在重新组织我的图像时,为了迎接OSX Mavericks,我正在编写一个脚本,将标记插入图像文件的xattr字段中,以便使用Spotlight搜索它们。(为了安全起见,我也在编辑EXIF。) 我的问题是: 哪种属性最好使用\u kMDItemUserTags似乎是OSX版本,但OpenMeta已经在使用kMDItemOMUserTags。理想情况下,我希望Linux和OSX能够向前兼容 如何设置多个标记?逗号或空格是分隔的还是其他的 例如,使用pythonxattr模块,我发出以下命令: xat

在重新组织我的图像时,为了迎接OSX Mavericks,我正在编写一个脚本,将标记插入图像文件的
xattr
字段中,以便使用Spotlight搜索它们。(为了安全起见,我也在编辑EXIF。)

我的问题是:

  • 哪种属性最好使用
    \u 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中可搜索的内容

    • 您需要在kMD之前添加com.apple.metadata:
    • 您必须使用十六进制编码或包裹在plist中
    这段python代码将为kMDItemFinderComment生成标记,该标记可在spotlight中搜索

    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]
    
    def writexattrs(F,标记列表):
    “”“writexattrs(F,标记列表):
    将标记列表写入以下字段:
    “kMDItemFinderComment”、“U kMDItemUserTags”、“kMDItemUserTags”
    此版本使用xattr库“”
    plistFront=''
    plistEnd=''
    plistTagString=''
    对于标记列表中的标记:
    plistTagString=plistTagString+'{}'。格式(标记)
    TagText=plistFront+plistTagString+plistEnd
    OptionalTag=“com.apple.metadata:”
    XattrList=[“kMDItemFinderComment”、“\u kMDItemUserTags”、“kMDItemUserTags”]
    对于XattrList中的字段:
    xattr.setxattr(F,OptionalTag+字段,TagText.encode('utf8'))
    #等效的shell命令是xattr-wcom.apple.metadata:kMDItemFinderComment[PLIST value][File name]
    
    我无法让它在一个有可靠结果的文件夹上递归工作

  • 如果您担心兼容性,则必须同时设置属性
    \u kMDItemUserTags
    kMDItemOMUserTags
    。我不认为有什么不同的解决方案,因为所有新的OSX应用程序都将使用前一个属性,而旧的应用程序仍然使用后一个属性。这只是我的猜测,但我猜OpenMeta最终将停止使用,取而代之的是新的本机API。展望未来,即使在Linux环境中,您也可以为新的应用程序/脚本使用
    \u kMDItemUserTags
    属性

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

  • 我修改了您的代码,使用二进制属性列表作为属性值,一切正常。这是我的密码。我正在使用biplist库,您可以通过
    easy\u 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"])
    
    在Spotlight中使用
    标记:
    对文件和目录进行测试

    希望这有帮助

    • 注意:我在回答这个问题时使用了OSXLion,但它应该可以在Mavericks上正常工作
    • 编辑:如果要将标记应用于目录的内容,则必须对每个文件单独执行,因为xattr python模块没有递归选项

    太棒了。我试试看。谢谢。除了链接的问题(右侧),在“询问不同”中还有(2013-11-15)谢谢。从那里链接的
    标记
    程序看起来很有用。