2013-08-02 47 views
4

在重新组织我的图像时,为了预期OSX Mavericks,我正在编写一个脚本来将标记插入到我的图像文件的xattr字段中,以便我可以使用Spotlight搜索它们。 (我也编辑EXIF只是为了安全起见。)通过_kMDItemUserTags或kMDItemOMUserTags在xattr中使用多个关键字

我的问题是:

  1. 哪个属性是最好的使用? _kMDItemUserTags似乎是OSX版本,但kMDItemOMUserTags已被OpenMeta使用。我最好喜欢Linux和OSX向前兼容的东西。

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

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

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

我也看到提及这些标签:kOMUserTagskMDItemkeywords但不知道他们是否容易实现......

编辑:进一步的调查表明,对于事情是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] 

我无法得到它与可靠的结果的文件夹上递归工作。

+0

除了链接的问题(在右边),Ask Different有[可能通过终端标记文件夹?](http://apple.stackexchange.com/q/110662/8546)( 2013-11-15) –

+0

谢谢。从那里链接的'tag'程序看起来很有用。 – beroe

回答

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

  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"]) 

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

希望这会有所帮助。

  • 注意:我使用的OS X Lion中的这个答案,但它应该在小牛队的工作没有任何问题。
  • 编辑:如果你想将这些代码应用到它必须为每个文件单独完成一个目录的内容,因为XATTR Python模块没有递归选项。
+0

太棒了。我会试试这个。谢谢。 – beroe

相关问题