37

Mavericks 以降、OS X には Finder でファイルにタグを付けたり、色を付けたりする機能がありました。

ファインダータグ

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

4

9 に答える 9

14

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

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

于 2013-11-27T05:56:12.770 に答える
6

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

 

基本

スクリプトでは、コマンドxattrを使用して、OpenMeta と Mavericks の両方のタグにアクセスできます。修飾子なしで使用すると$ 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

Automator サービス

于 2013-12-03T20:00:21.483 に答える
2

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

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

ここで、[色] は、以下に定義されている名前または略語です。

    clear (c), grAy (a), green (g), purple (p), 
    blue (b), yellow (y), red (r), orange (o)
于 2013-11-01T07:02:25.797 に答える
2

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

または、 XATTRコマンドを使用して、コマンド ラインから拡張属性を操作することもできます。

于 2013-11-01T03:41:24.567 に答える
1

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

NSURLsetResourceValue: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: 設定されているタグの色名の配列を返します。
于 2016-03-21T08:31:54.793 に答える
0

異なる質問で

複数の回答があり、そのうちの1つが受け入れられます:


ここスタック オーバーフローでは、質問が少し前 (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.comApple 指向のcom.apple.metadata:kMDItemOMUserTagsアプローチ。

したがって、Apple ソフトウェアが両方のタグ付けアプローチとの互換性を獲得したり維持したりすることを期待するべきではありません。


エッジケース

場合によっては、OpenMeta 指向のタグを削除せずに、Apple 指向のタグを削除することが望ましい場合ありますcom.apple.metadata:_kMDItemUserTags com.apple.metadata:kMDItemOMUserTags

ただし、プログラムでこれを行うことは、@nacross の質問の範囲を超えている可能性があります。

于 2015-07-26T07:50:57.783 に答える