Подтвердить что ты не робот

Как я могу добавить "теги" OS X к файлам программно?

Так как Mavericks, OS X имеет возможность тегировать и окрашивать файлы в Finder.

finder tags

Есть ли способ добавить теги в файлы через API Cocoa или через команду оболочки?

4b9b3361

Ответ 1

Извините за добавление другого ответа, но тот, который связан с настройкой цветов меток, был довольно длинным. Вот отрывок из python script, который я использую для установки тегов пользователя. Кажется, что это работает, чтобы сделать вещи доступными для поиска, но не уверен, что теги будут отображаться правильно. Использование в основном:

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)

Ответ 3

Я добавляю этот ответ, потому что OP запросил оболочку script и пометил ее bash. Я написал эту службу Automator, которая тегирует выбранный файл с тегами другого файла. Я добавил комментарии, чтобы описать использование взаимодействия bash с тегами и цветами с помощью bash script.

 

Основы

В сценариях доступны теги 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 борется под давлением мечения. Если у вас есть 800 файлов с тегами kapow, каждый в другой папке, а затем вы выбираете синий цвет для kapow, Finder должен найти и изменить атрибуты для каждого отдельного файла.

Вы можете поиграть с странностью, удалив атрибут com.apple.FinderInfo из помеченного и цветного файла: $ xattr -d com.apple.FinderInfo [file]. Цвет исчезает в списках Finder, но тег (и его цвет) остается связанным с файлом.

 

Bash script для импорта тегов из другого файла

В script выбранный файл в Finder/сохраняется в переменной $без тегов, а выбранный поставщик тегов $tagfull.

TAGFULID=${#@}
TAGFUL=${!TAGFULID}

## Use xattr to read all existing tags:
ATTRS=$(xattr "$TAGFUL")

for f in "[email protected]" ## 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

Ответ 4

В Apple Что нового в OS X говорится, что NSURL обрабатывает теги, а Common File System Resource_Keys предоставляет требуемый ключ как NSURLTagNamesKey и указывает, что его значение представляет собой только массив строк.

Ответ 5

OpenMeta framework - это сторонний стандарт для добавления метаданных в файлы OS X с использованием расширенных атрибутов. Он используется рядом сторонних приложений.

Или вы можете использовать команду XATTR для управления расширенными атрибутами через командную строку.

Ответ 6

Вы можете дать этот выстрел:

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>

в список любых тегов, которые вы хотите добавить.

Ответ 7

Это не распространяется на теги, но для изменения цветов ярлыков один из способов сделать это - с помощью следующей команды:

xattr -wx com.apple.FinderInfo \
0000000000000000000400000000000000000000000000000000000000000000 myfile.txt

04, похороненный в середине, устанавливает цвет файла.

Вот питон script, который обертывает эту команду, позволяет установить цвет тега в файле или серии файлов:

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)

Ответ 8

In Ask Different

С несколькими ответами, один из которых принят:


Здесь, в Stack Overflow, вопрос возник чуть раньше (2013-11-01), поэтому я добавлю свой ответ здесь.

openmeta​​h2 >

Открытый исходный код 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, а теперь в интернет-архиве Wayback Machine) напоминает нам, что com.apple.metadata использовался Apple, когда OpenMeta (проект не в домене apple.com) начал ориентированный на Apple подход com.apple.metadata:kMDItemOMUserTags.

Поэтому я не должен ожидать, что программное обеспечение Apple получит или поддержит совместимость с обоими подходами к маркировке.


Кромки с краями

В некоторых случаях может быть желательно удалить теги Apple -ориентированные com.apple.metadata:_kMDItemUserTags, не удаляя теги OpenMeta​​strong > -ориентированные com.apple.metadata:kMDItemOMUserTags.

Однако выполнение этого - программно - возможно, выходит за рамки вопроса, заданного @nacross.

Ответ 9

Начиная с 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):

  • @(0): Нет
  • @(1): серый
  • @(2): зеленый
  • @(3): Фиолетовый
  • @(4): синий
  • @(5): желтый
  • @(6): Красный
  • @(7): Оранжевый

Мне не удалось установить тег, используя NSURLLabelColorKey. Вот мой опыт работы с El Capitan с ключами, связанными с "тегами" (Цвета):

  • NSURLLabelNumberKey: можно прочитать/установить успешно, с номерами 0-7. Любое другое число вернет ошибку. Если установлено несколько тегов, это вернет индекс первого цвета, который будет установлен, поскольку он будет искать численно через индексы с 1 по 7. Хотя вы можете очистить цвет в Finder, щелкнув по цвету, программно установив цвет который уже установлен, не очищает этот цвет.
  • NSURLLabelColorKey: возвращает nil, даже если для файла задан цветовой тэг. Установка значения с помощью этой клавиши не влияет.
  • NSURLTagNamesKey: возвращает массив имен цветов для установленных тегов.

Ответ 10

Начиная с Mavericks, также можно установить цвета тегов в Cocoa, используя NSAppleScript.

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

Если это выполняется в файле, который имеет только один цвет, тогда он очищает текущий цвет и устанавливает указанный цвет. Однако, если в файл уже установлены несколько цветов, то перед установкой указанного цвета он не очищает существующие цвета.

Используя среду AppleScript, цветовое сопоставление выглядит следующим образом:

  • 0: Нет
  • 1: Оранжевый
  • 2: Красный
  • 3: Желтый
  • 4: Синий
  • 5: Фиолетовый
  • 6: Зеленый
  • 7: Серый