web-dev-qa-db-ja.com

プログラムでOS Xの「タグ」をファイルに追加するにはどうすればよいですか?

Mavericks以降、OS XはFinderでファイルのタグ付けとカラーリングを行う機能を備えています。

Finder tags

Cocoa APIまたはシェルコマンドを介してファイルにタグを追加する方法はありますか?

27
nacross

別の答えを追加して申し訳ありませんが、ラベルの色の設定に関連するものはすでにかなり長くなっています。これは、ユーザータグの設定に使用する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)
11
beroe

タグ「Mac OS X 10.9 Mavericksファイルでタグを操作し、それらのタグが付いたファイルを照会するコマンドラインツール」を確認してください。 GitHubリポジトリにはインストール手順があります (HomebrewおよびMacPortsパッケージがあります)。

9
sillygwailo

OPがシェルスクリプトを要求してタグを付けたので、この答えを追加しましたbash。選択したファイルに別のファイルのタグをタグ付けするこのAutomatorサービスを作成しました。 bashスクリプトを使用したタグと色とのbashの相互作用の使用を概説するコメントを追加しました。

基本

スクリプトでは、OpenMetaタグとMavericksタグの両方にコマンドxattrを使用してアクセスできます。修飾子なしで使用すると、$ xattr [file]、設定された属性のリストを提供します。 $ xattr -hは、使用方法に関する素晴らしいガイドを提供します。

Mavericksのタグはcom.Apple.metadata:_kMDItemUserTagsにありますが、OpenMetaタグはさまざまな属性に含めることができます。とりわけ com.Apple.metadata:kOMUserTagsorg.openmetainfo:kMDItemOMUserTagsおよびorg.openmetainfo:kOMUserTags

Mavericksは、_kMDItemUserTagsにタグを配置し、すべてのファイルのFinderInfoに色を配置することで、さまざまな属性の色とタグを処理します。これは奇妙な選択であり、タグ付けのプレッシャーの下でFinderが苦労する理由の1つです。 kapowのタグが付いた800個のファイルがそれぞれ異なるフォルダーにあり、その後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

The Automator service

5
Rasmus

Appleの OS Xの新機能NSURLがタグを処理することを示し、 Common File System Resource_Keys は必要なキーをNSURLTagNamesKeyとして提供しますそして、その値は単なる文字列の配列であると述べています。

4
CRD

あなたは これ ショットを与えることができます:

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>

追加するタグのリストに追加します。

2
Sperr

OpenMeta フレームワークは、拡張属性を使用してOS Xファイルにメタデータを追加するためのサードパーティの標準です。多くのサードパーティアプリケーションで使用されています。

または、 [〜#〜] xattr [〜#〜] コマンドを使用して、コマンドラインから拡張属性を操作できます。

2
Imran S.

これはタグをカバーしていませんが、ラベルの色を変更するための1つの方法は、次のようなコマンドを使用することです。

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)
1
beroe

Mavericksから開始すると、NSURLを使用して、Cocoaでカラータグを取得および設定できます。

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]);
}

色が1つしかないファイルでこれを実行すると、現在の色がクリアされ、指定した色が設定されます。ただし、ファイルに複数の色がすでに設定されている場合は、指定された色を設定する前に既存の色をクリアしません。

これが値と色のマッピングです(El Capitanの場合):

  • @(0):なし
  • @(1):グレー
  • @(2):緑
  • @(3):紫
  • @(4):青
  • @(5):黄
  • @(6):赤
  • @(7):オレンジ

NSURLLabelColorKeyを使用してタグを設定できませんでした。エルキャピタンでの私の経験と「タグ」(色)に関連するキーを以下に示します。

  • NSURLLabelNumberKey:0〜7の数値で正常に読み取り/設定できます。他の番号はエラーを返します。複数のタグが設定されている場合、インデックス1〜7を数値で検索するため、設定されている最初の色のインデックスが返されます。Finderで色をクリックして色をクリアすることもできますが、プログラムで色を設定します既に設定されているため、その色はクリアされません。
  • NSURLLabelColorKey:ファイルにカラータグが設定されている場合でも、nilを返します。このキーで値を設定しても効果はありません。
  • NSURLTagNamesKey:設定されているタグの色名の配列を返します。
0
Sheamus

Mavericksから始めて、NSAppleScriptを使用して、Cocoaで色タグを設定することも可能です。

NSURL *fileURL = [NSURL fileURLWithPath:@"/Users/sheaparis/Documents/filezilla_sites.xml"];

//Format the filepath for the AppleScript environment.
//  Without this, the file cannot be found.
NSString *filepath = [fileURL path];
NSString *appleScriptFilePath = [filepath stringByReplacingOccurrencesOfString:@"/" withString:@":"];
if ([appleScriptFilePath hasPrefix:@":"]) {
    appleScriptFilePath = [appleScriptFilePath substringFromIndex:1];
}
NSLog(@"appleScriptFilePath: %@", appleScriptFilePath);

//Tells Finder to set the Red color tag for the specified file
NSString *sourceString = [NSString stringWithFormat:
                          @"set theFile to \"%@\" as alias\n"
                          "tell application \"Finder\" to set label index of theFile to 2", appleScriptFilePath];
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:sourceString];

NSDictionary *scriptErrorDict = nil;
[script executeAndReturnError:&scriptErrorDict];
if (scriptErrorDict) {
    NSLog(@"errorDict: %@", scriptErrorDict);
}

色が1つしかないファイルでこれを実行すると、現在の色がクリアされ、指定した色が設定されます。ただし、ファイルに複数の色がすでに設定されている場合は、指定された色を設定する前に既存の色をクリアしません。

AppleScript環境を使用すると、カラーマッピングは次のようになります。

  • 0:なし
  • 1:オレンジ
  • 2:赤
  • 3:黄
  • 4:青
  • 5:パープル
  • 6:緑
  • 7:グレー
0
Sheamus