Gibt es eine Möglichkeit, Tags in einer Datei mit Applescript unter Mavericks festzulegen / hinzuzufügen?

9

Ich habe versucht, einige meiner Skripte unter Mavericks von Labels zu Tags zu verschieben, aber ich kann anscheinend keine Möglichkeit finden, Tags mit Applescript festzulegen / hinzuzufügen.

Wer weiß, wie man das macht? Soweit ich das beurteilen kann, sind Tags nicht wirklich neu, sondern nur neu, da sie ein zentraler Bestandteil des aktualisierten Finders sind.

Christian A. Strømmen
quelle

Antworten:

7

Sie können xattr verwenden. Dadurch werden die Tags von Datei1 nach Datei2 kopiert:

xattr -wx com.apple.metadata:_kMDItemUserTags "$(xattr -px com.apple.metadata:_kMDItemUserTags file1)" file2
xattr -wx com.apple.FinderInfo "$(xattr -px com.apple.FinderInfo file1)" file2

Die Tags werden in einer Eigenschaftsliste als einzelnes Array von Zeichenfolgen gespeichert:

$ xattr -p com.apple.metadata:_kMDItemUserTags file3|xxd -r -p|plutil -convert xml1 - -o -
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Red
6</string>
    <string>aa</string>
    <string>Orange
7</string>
    <string>Yellow
5</string>
    <string>Green
2</string>
    <string>Blue
4</string>
    <string>Purple
3</string>
    <string>Gray
1</string>
</array>
</plist>

Die Tags für Farben haben Werte wie Red\n6(wo \nist ein Zeilenvorschub).

Wenn das kColor-Flag in com.apple.FinderInfo nicht gesetzt ist, zeigt Finder die Kreise für Farben neben Dateien nicht an. Wenn das kColor-Flag auf Orange gesetzt ist und die Datei das rote Tag hat, zeigt der Finder sowohl rote als auch orangefarbene Kreise an. Sie können das kColor-Flag mit AppleScript setzen:

do shell script "xattr -w com.apple.metadata:_kMDItemUserTags '(\"Red\\n6\",\"new tag\")' ~/desktop/file4"
tell application "Finder" to set label index of file "file4" of desktop to item 1 of {2, 1, 3, 6, 4, 5, 7}

'("Red\n6","new tag")' ist dafür eine Plist-Syntax im alten Stil:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>Red
6</string>
    <string>new tag</string>
</array>
</plist>

xattr -p com.apple.FinderInfo file|head -n1|cut -c28-29Gibt den Wert der für das kColor-Flag verwendeten Bits aus. Rot ist C, Orange ist E, Gelb ist A, Grün ist 4, Blau ist 8, Magenta ist 6 und Grau ist 2. (Das Flag, das 1 zu den Werten hinzufügen würde, wird in OS X nicht verwendet.)

Lri
quelle
sind die "Tag-Bilder" .PNGs oder farbgerenderte Grafiken? konnte so etwas wie "C.png" nicht auf der Festplatte finden :)
1

Die Antwort wurde in der Applescript-Benutzerliste veröffentlicht:

http://lists.apple.com/archives/applescript-users/2015/Jan/msg00193.html


Zitat aus dem Seitencode von Shane Stanley

Mit AppleScriptObjC können Sie dies problemlos tun. Hier sind Handler zum Abrufen von Tags, Festlegen von Tags und Hinzufügen von Tags:

use scripting additions
use framework "Foundation"

on returnTagsFor:posixPath -- get the tags
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath -- make URL
    set {theResult, theTags} to aURL's getResourceValue:(reference) forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    if theTags = missing value then return {} -- because when there are none, it returns missing value
    return theTags as list
end returnTagsFor:

on setTags:tagList forPath:posixPath -- set the tags, replacing any existing tags
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath -- make URL
    aURL's setResourceValue:tagList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
end setTags:forPath:

on addTags:tagList forPath:posixPath -- add to existing tags
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath -- make URL
    -- get existing tags
    set {theResult, theTags} to aURL's getResourceValue:(reference) forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    if theTags  missing value then -- add new tags
        set tagList to (theTags as list) & tagList
        set tagList to (current application's NSOrderedSet's orderedSetWithArray:tagList)'s allObjects() -- delete any duplicates
    end if
    aURL's setResourceValue:tagList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
end addTags:forPath:

Wenn Sie sie in einer Skriptbibliothek speichern, können Sie sie auch von Mavericks verwenden.

- Shane Stanley www.macosxautomation.com/applescript/apps/

brandelune
quelle