如何以编程方式将OS X"标签"添加到文件中?

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)


sil*_*ilo 9

查看标签,"在Mac OS X 10.9 Mavericks文件上操作标签的命令行工具,以及查询带有这些标签的文件".GitHub存储库有安装说明(有Homebrew和MacPorts包).


Spe*_*err 5

你可以给一个镜头:

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)

到要添加的任何标签的列表。


Ras*_*mus 5

我添加了这个答案,因为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:kMDItemOMUserTagsorg.openmetainfo:kOMUserTags.

小牛通过在_kMDItemUserTags中放置标签并在FinderInfo中为每个文件放置颜色来处理不同属性中的颜色和标签.这是一个奇怪的选择,这也是Finder在标记压力下挣扎的原因之一.如果您有800个文件标记为kapow,每个文件位于不同的文件夹中,并且您随后为kapow选择蓝色,则Finder必须查找并更改每个文件的属性.

您可以通过从标记的彩色文件中删除com.apple.FinderInfo属性来解决这个问题:$ xattr -d com.apple.FinderInfo [file].颜色将在Finder列表中消失,但标记(及其颜色)仍与文件关联.

 

Bash脚本从另一个文件导入标签

在脚本中,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)

Automator服务