Mavericks以降、OS XはFinderでファイルのタグ付けとカラーリングを行う機能を備えています。
Cocoa APIまたはシェルコマンドを介してファイルにタグを追加する方法はありますか?
別の答えを追加して申し訳ありませんが、ラベルの色の設定に関連するものはすでにかなり長くなっています。これは、ユーザータグの設定に使用する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がシェルスクリプトを要求してタグを付けたので、この答えを追加しましたbash。選択したファイルに別のファイルのタグをタグ付けするこのAutomatorサービスを作成しました。 bashスクリプトを使用したタグと色とのbashの相互作用の使用を概説するコメントを追加しました。
スクリプトでは、OpenMetaタグとMavericksタグの両方にコマンドxattrを使用してアクセスできます。修飾子なしで使用すると、$ xattr [file]
、設定された属性のリストを提供します。 $ xattr -h
は、使用方法に関する素晴らしいガイドを提供します。
Mavericksのタグはcom.Apple.metadata:_kMDItemUserTagsにありますが、OpenMetaタグはさまざまな属性に含めることができます。とりわけ com.Apple.metadata:kOMUserTags
、org.openmetainfo:kMDItemOMUserTags
およびorg.openmetainfo:kOMUserTags
。
Mavericksは、_kMDItemUserTagsにタグを配置し、すべてのファイルのFinderInfoに色を配置することで、さまざまな属性の色とタグを処理します。これは奇妙な選択であり、タグ付けのプレッシャーの下でFinderが苦労する理由の1つです。 kapowのタグが付いた800個のファイルがそれぞれ異なるフォルダーにあり、その後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
Appleの OS Xの新機能 はNSURL
がタグを処理することを示し、 Common File System Resource_Keys は必要なキーをNSURLTagNamesKey
として提供しますそして、その値は単なる文字列の配列であると述べています。
あなたは これ ショットを与えることができます:
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>
追加するタグのリストに追加します。
OpenMeta フレームワークは、拡張属性を使用してOS Xファイルにメタデータを追加するためのサードパーティの標準です。多くのサードパーティアプリケーションで使用されています。
または、 [〜#〜] xattr [〜#〜] コマンドを使用して、コマンドラインから拡張属性を操作できます。
これはタグをカバーしていませんが、ラベルの色を変更するための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)
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の場合):
NSURLLabelColorKey
を使用してタグを設定できませんでした。エルキャピタンでの私の経験と「タグ」(色)に関連するキーを以下に示します。
NSURLLabelNumberKey
:0〜7の数値で正常に読み取り/設定できます。他の番号はエラーを返します。複数のタグが設定されている場合、インデックス1〜7を数値で検索するため、設定されている最初の色のインデックスが返されます。Finderで色をクリックして色をクリアすることもできますが、プログラムで色を設定します既に設定されているため、その色はクリアされません。NSURLLabelColorKey
:ファイルにカラータグが設定されている場合でも、nilを返します。このキーで値を設定しても効果はありません。NSURLTagNamesKey
:設定されているタグの色名の配列を返します。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
環境を使用すると、カラーマッピングは次のようになります。