自 Mavericks 以来,OS X 已经能够在 Finder 中标记和着色文件。
有没有办法通过 Cocoa API 或通过 shell 命令向文件添加标签?
自 Mavericks 以来,OS X 已经能够在 Finder 中标记和着色文件。
有没有办法通过 Cocoa API 或通过 shell 命令向文件添加标签?
很抱歉添加另一个答案,但与设置标签颜色相关的答案已经很长了。这是我用来设置用户标签的 python 脚本的摘录。它似乎可以使事物可搜索,但不确定标签是否会正确显示。用法基本上是:
tagfile.py "Tag Name" FileOrFolderName
代码如下。
#! /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)
查看标签,“一个命令行工具,用于在 Mac OS X 10.9 Mavericks 文件上操作标签,并查询带有这些标签的文件”。GitHub 存储库有安装说明(有 Homebrew 和 MacPorts 包)。
我添加了这个答案,因为 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
。
Mavericks 通过在 _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
你可以试一试:
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
您需要将 $currentFile 替换为要添加标签的文件,然后更改
<string>Orange</string><string>Red</string>
添加到您要添加的任何标签的列表中。
在 Apple 的What's New in OS X 中,它声明NSURL
处理标签,Common File System Resource_Keys提供所需的密钥,NSURLTagNamesKey
并声明其值只是一个字符串数组。
这不包括标签,但要更改标签颜色,一种方法是通过如下命令:
xattr -wx com.apple.FinderInfo \
0000000000000000000400000000000000000000000000000000000000000000 myfile.txt
04
埋在中间的是设置文件颜色。
这是一个包装了该命令的 python 脚本,可让您在一个文件或一系列文件上设置标签颜色:
import sys
import subprocess
def colorizeFile(ColorName,FileName):
ReverseTable = {
"clear" : "01",
"gray" : "03",
"green" : "04",
"purple" : "06",
"blue" : "09",
"yellow" : "0A",
"red" : "0C",
"orange" : "0E",
"c" : "01",
"a" : "03",
"g" : "04",
"p" : "06",
"b" : "09",
"y" : "0A",
"r" : "0C",
"o" : "0E",
}
HexString = 18*"0" + ReverseTable.get(ColorName) + 44*"0"
Xcommand = 'xattr -wx com.apple.FinderInfo {0} {1}'.format(HexString,FileName)
ProcString = subprocess.check_call(Xcommand, stderr=subprocess.STDOUT,shell=True)
if __name__ == "__main__":
if len(sys.argv)<3:
sys.stderr.write(__doc__.format(sys.argv[0]))
else:
Cname = sys.argv[1]
Flist = sys.argv[2:]
for File in Flist:
colorizeFile(Cname.lower(),File)
sys.stderr.write("## Colorized {0} file(s) as {1}\n".format(len(Flist),Cname))
用法是:
labelcolor.py [color] *.jpg
其中 [color] 是如下定义的名称或缩写:
clear (c), grAy (a), green (g), purple (p),
blue (b), yellow (y), red (r), orange (o)
从 Mavericks 开始,可以在 Cocoa 中获取和设置颜色标签,使用NSURL
.
NSURL
setResourceValue:forKey:error:
有许多可以通过相应的和getResourceValue:forKey:error:
方法设置或读取的属性。
使用该NSURLLabelNumberKey
键,您可以设置颜色标签,如下所示:
NSURL *fileURL = [NSURL fileURLWithPath:@"/Users/[username]/Documents/[some_file]"];
NSError *resourceError;
if (![fileURL setResourceValue:@(2) forKey:NSURLLabelNumberKey error:&resourceError]) {
NSLog(@"Error while setting file resource: %@", [resourceError localizedDescription]);
}
如果对只有一种颜色的文件执行此操作,则会清除当前颜色并设置指定颜色。但是,如果文件上已经设置了多种颜色,则在设置指定颜色之前不会清除现有颜色。
这是值颜色映射(在 El Capitan 上):
我无法使用NSURLLabelColorKey
. 这是我在 El Capitan 上的体验,其中的键与“标签”(颜色)相关:
NSURLLabelNumberKey
:可以读取/设置成功,数字0-7。任何其他数字都将返回错误。如果设置了多个标签,那么这将返回设置的第一个颜色的索引,因为它通过索引 1 到 7 进行数字搜索。虽然您可以通过单击颜色在 Finder 中清除颜色,但以编程方式设置颜色已经设置并不会清除该颜色。NSURLLabelColorKey
: 返回 nil,即使为文件设置了颜色标签。使用此键设置值无效。NSURLTagNamesKey
:返回已设置标签的颜色名称数组。有多个答案,其中一个被接受:
在 Stack Overflow 中,这个问题稍早出现(2013-11-01),所以我会在这里添加我的答案。
在https://code.google.com/p/openmeta/source/browse/trunk/trunk/openmeta开源
该openmeta
命令似乎采用双属性方法,同时使用以下两种方法:
com.apple.metadata:kMDItemOMUserTags
com.apple.metadata:_kMDItemUserTags
sh-3.2$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.9.5
BuildVersion: 13F1096
sh-3.2$ uname -a
Darwin gpes3e-gjp4.local 13.4.0 Darwin Kernel Version 13.4.0: Wed Mar 18 16:20:14 PDT 2015; root:xnu-2422.115.14~1/RELEASE_X86_64 x86_64
sh-3.2$ date
Sun 26 Jul 2015 08:00:23 BST
sh-3.2$ rm ~/Desktop/test.txt
sh-3.2$ touch ~/Desktop/test.txt
sh-3.2$ xattr -l ~/Desktop/test.txt
sh-3.2$ ./openmeta
openmeta version 0.1 by Tom Andersen code.google.com/p/openmeta/
Usage: openmeta [options] -p PATH[s]
Note that commas are to be used nowhere - tag lists use quotes for two word tags in output
example (list tags and ratings): openmeta -p PATH
example (list tags and ratings multiple): openmeta -p PATH PATH
example (list tags): openmeta -t -p PATH[s]
example (add tags): openmeta -a foo bar -p PATH[s]
example (add tags with spaces): openmeta -a "three word tag" "foo bar" -p PATH[s]
example (set tags): openmeta -s foo bar -p PATH[s]
example (clear all tags): openmeta -s -p PATH[s]
example (set managed): openmeta -m Y -p PATH[s]
example (set rating 0 - 5 stars): openmeta -r 3.5 -p PATH[s]
example (print rating): openmeta -r -p PATH[s]
example (clear rating): openmeta -r 0.0 -p PATH[s]
example (lousy rating): openmeta -r 0.1 -p PATH[s]
sh-3.2$ ./openmeta -a kerfuffle -p ~/Desktop/test.txt
kerfuffle /Users/gjp22/Desktop/test.txt
sh-3.2$ ./openmeta -p ~/Desktop/test.txt
/Users/gjp22/Desktop/test.txt
tags: kerfuffle
rating: none found
sh-3.2$ xattr -l ~/Desktop/test.txt
com.apple.metadata:kMDItemOMUserTagTime:
00000000 62 70 6C 69 73 74 30 30 33 41 BB 64 BD 3C D4 95 |bplist003A.d.<..|
00000010 F2 08 00 00 00 00 00 00 01 01 00 00 00 00 00 00 |................|
00000020 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 11 |..|
00000032
com.apple.metadata:kMDItemOMUserTags:
00000000 62 70 6C 69 73 74 30 30 A1 01 59 6B 65 72 66 75 |bplist00..Ykerfu|
00000010 66 66 6C 65 08 0A 00 00 00 00 00 00 01 01 00 00 |ffle............|
00000020 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 14 |......|
00000036
com.apple.metadata:_kMDItemUserTags:
00000000 62 70 6C 69 73 74 30 30 A1 01 5B 6B 65 72 66 75 |bplist00..[kerfu|
00000010 66 66 6C 65 0A 30 08 0A 00 00 00 00 00 00 01 01 |ffle.0..........|
00000020 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 16 |........|
00000038
kOM109SyncDone:
00000000 62 70 6C 69 73 74 30 30 09 08 00 00 00 00 00 00 |bplist00........|
00000010 01 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 09 |..........|
0000002a
sh-3.2$
例如,Apple Finder。
使用 Finder 移除 kerfuffle 标签后, kerfuffle仍保留为 OpenMeta 标签:
sh-3.2$ date ; xattr -l ~/Desktop/test.txt
Sun 26 Jul 2015 08:02:13 BST
com.apple.metadata:kMDItemOMUserTagTime:
00000000 62 70 6C 69 73 74 30 30 33 41 BB 64 BD 3C D4 95 |bplist003A.d.<..|
00000010 F2 08 00 00 00 00 00 00 01 01 00 00 00 00 00 00 |................|
00000020 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 11 |..|
00000032
com.apple.metadata:kMDItemOMUserTags:
00000000 62 70 6C 69 73 74 30 30 A1 01 59 6B 65 72 66 75 |bplist00..Ykerfu|
00000010 66 66 6C 65 08 0A 00 00 00 00 00 00 01 01 00 00 |ffle............|
00000020 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 14 |......|
00000036
com.apple.metadata:_kMDItemUserTags:
00000000 62 70 6C 69 73 74 30 30 A0 08 00 00 00 00 00 00 |bplist00........|
00000010 01 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 09 |..........|
0000002a
kOM109SyncDone:
00000000 62 70 6C 69 73 74 30 30 09 08 00 00 00 00 00 00 |bplist00........|
00000010 01 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 09 |..........|
0000002a
sh-3.2$
注意域和命名约定:开发人员对采用 OpenMeta 的想法 – Ironic Software(2009-03,现在在 Internet Archive Wayback Machine)提醒我们,com.apple.metadata
当 OpenMeta(不在域中的项目apple.com
)开始面向苹果的com.apple.metadata:kMDItemOMUserTags
方法。
因此,我不应该期望 Apple 软件能够获得或保持与这两种标记方法的兼容性。
在某些情况下,可能需要删除面向Applecom.apple.metadata:_kMDItemUserTags
的标签而不删除 面向 OpenMeta的标签com.apple.metadata:kMDItemOMUserTags
。
但是,以编程方式这样做可能超出了@nacross 提出的问题的范围。