nac*_*oss 27 macos cocoa metadata command-line-tool
自Mavericks以来,OS X已经能够在Finder中标记和着色文件.

有没有办法通过Cocoa API或shell命令向文件添加标签?
ber*_*roe 11
很抱歉添加了另一个答案,但与设置标签颜色相关的答案已经很久了.这是我用来设置用户标签的python脚本的摘录.它似乎可以使事情可搜索,但不确定标签是否会正确显示.用法基本上是:
tagfile.py "Tag Name" FileOrFolderName
Run Code Online (Sandbox Code Playgroud)
代码如下.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
""" Write tags to file
Usage:
tagfile.py "TagName" FileName1 FileName2
You can use wildcards for the file name. Use quotes if spaces in tags.
To check if it worked, use xattr -l FileName
"""
import sys
import subprocess
def writexattrs(F,TagList):
""" writexattrs(F,TagList):
writes the list of tags to three xattr fields on a file-by file basis:
"kMDItemFinderComment","_kMDItemUserTags","kMDItemOMUserTags
Uses subprocess instead of xattr module. Slower but no dependencies"""
Result = ""
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.replace("'","-"))
TagText = plistFront + plistTagString + plistEnd
OptionalTag = "com.apple.metadata:"
XattrList = ["kMDItemFinderComment","_kMDItemUserTags","kMDItemOMUserTags"]
for Field in XattrList:
XattrCommand = 'xattr -w {0} \'{1}\' "{2}"'.format(OptionalTag + Field,TagText.encode("utf8"),F)
if DEBUG:
sys.stderr.write("XATTR: {}\n".format(XattrCommand))
ProcString = subprocess.check_output(XattrCommand, stderr=subprocess.STDOUT,shell=True)
Result += ProcString
return Result
DEBUG = False
if __name__ == "__main__":
if len(sys.argv) < 3:
print __doc__
else:
TagList = [ sys.argv[1] ]
# print TagList
# Or you can hardwire your tags here
# TagList = ['Orange','Green']
FileList = sys.argv[2:]
for FileName in FileList:
writexattrs(FileName, TagList)
Run Code Online (Sandbox Code Playgroud)
你可以给这一个镜头:
xattr -w com.apple.metadata:_kMDItemUserTags '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><array><string>Orange</string><string>Red</string></array></plist>' $currentFile
Run Code Online (Sandbox Code Playgroud)
您需要将 $currentFile 替换为您想要添加标签的文件,然后更改
<string>Orange</string><string>Red</string>
Run Code Online (Sandbox Code Playgroud)
到要添加的任何标签的列表。
我添加了这个答案,因为OP要求shell脚本并将其标记为bash.我编写了这个Automator服务,它使用另一个文件的标签标记所选文件.我添加了注释,以概述使用bash脚本使用bash与标记和颜色的交互.
在脚本中,可以使用命令xattr访问OpenMeta和Mavericks标记.在没有修饰符的情况下使用它$ xattr [file],会给出一组设置属性.$ xattr -h给出了一个很好的使用指南.
Mavericks的标签位于com.apple.metadata:_kMDItemUserTags中,而OpenMeta标签可以具有各种属性.其中com.apple.metadata:kOMUserTags,org.openmetainfo:kMDItemOMUserTags和org.openmetainfo:kOMUserTags.
小牛通过在_kMDItemUserTags中放置标签并在FinderInfo中为每个文件放置颜色来处理不同属性中的颜色和标签.这是一个奇怪的选择,这也是Finder在标记压力下挣扎的原因之一.如果您有800个文件标记为kapow,每个文件位于不同的文件夹中,并且您随后为kapow选择蓝色,则Finder必须查找并更改每个文件的属性.
您可以通过从标记的彩色文件中删除com.apple.FinderInfo属性来解决这个问题:$ xattr -d com.apple.FinderInfo [file].颜色将在Finder列表中消失,但标记(及其颜色)仍与文件关联.
在脚本中,Finder中的选定文件将保存到变量$ tagless,并且所选的标记供应商为$ tagfull.
TAGFULID=${#@}
TAGFUL=${!TAGFULID}
## Use xattr to read all existing tags:
ATTRS=$(xattr "$TAGFUL")
for f in "$@" ## For every selected file in Finder, do:
do
if("$TAGFUL"="$f") ## Is the supplier of tags is amongst the selected files?
then
break
fi
if [[ "$ATTRS" == *kMDItemUserTags* ]] ## Are there tags?
then
## Load tags:
TAGS=$(xattr -px com.apple.metadata:_kMDItemUserTags "$TAGFUL")
## Write tags:
xattr -wx com.apple.metadata:_kMDItemUserTags "$TAGS" "$f"
fi
if [[ "$ATTRS" == *FinderInfo* ]] ## Are there colours?
then
## Load colour:
FINDERINFO=$(xattr -px com.apple.FinderInfo "$TAGFUL")
## Write colour:
xattr -wx com.apple.FinderInfo "$FINDERINFO" "$f"
fi
done
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
15314 次 |
| 最近记录: |