ber*_*roe 5 python macos spotlight xattr osx-mavericks
在重新组织图像时,出于对OSX Mavericks的期待,我正在编写一个脚本以将标签插入xattr图像文件的字段中,以便可以使用Spotlight搜索它们。(为了安全起见,我也在编辑EXIF。)
我的问题是:
最好使用哪个属性?_kMDItemUserTags似乎是OSX版本,但kMDItemOMUserTagsOpenMeta已在使用它。理想情况下,我希望将与Linux和OSX向前兼容。
如何设置多个标签?是用逗号或空格分隔还是其他?
作为示例,使用python xattr模块,我发出了以下命令:
xattr.setxattr(FileName, "_kMDItemUserTags", "Name - Sample")
xattr.setxattr(FileName, "kMDItemOMUserTags", "Name,Institution,Sample")
Run Code Online (Sandbox Code Playgroud)
我也看到这些标签的记载:kOMUserTags和kMDItemkeywords,但不知道他们是否有可能实现?
编辑:进一步的调查表明,对于在10.8中可搜索的事物,
此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]
Run Code Online (Sandbox Code Playgroud)
我无法使其在具有可靠结果的文件夹上递归工作。
如果您担心兼容性,则必须设置属性_kMDItemUserTags和kMDItemOMUserTags。我认为没有不同的解决方案,因为所有新的 OS X 应用程序都将使用前一个属性,而旧的应用程序仍然使用后者。这只是我的猜测,但我猜想 OpenMeta 最终会停止使用,取而代之的是新的原生 API。展望未来,_kMDItemUserTags即使在 Linux 环境中,您也可以在新应用程序/脚本中使用该属性。
正如您所了解的,标签被设置为属性列表编码的字符串数组。我不知道这是否是一个要求,但 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"])
Run Code Online (Sandbox Code Playgroud)
在 Spotlight 中使用文件和目录进行测试tag:<some_tag>。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |