Alguma maneira de definir / adicionar tags em um arquivo com Applescript em Mavericks?

9

Tentando mover alguns dos meus scripts de rótulos para tags em Mavericks, mas parece que não consigo encontrar uma maneira de definir / adicionar tags com o Applescript.

Alguém que sabe como fazer isso? Tanto quanto posso imaginar, as tags não são realmente novas, apenas novas em termos de ser uma parte mais central do Finder atualizado.

Christian A. Strømmen
fonte

Respostas:

7

Você pode usar o xattr. Isso copia as tags do arquivo1 para o arquivo2:

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

As tags são armazenadas em uma lista de propriedades como uma única matriz de strings:

$ 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>

As tags para cores têm valores como Red\n6(onde \né um avanço de linha).

Se o sinalizador kColor em com.apple.FinderInfo estiver desativado, o Finder não mostrará os círculos para cores ao lado dos arquivos. Se o sinalizador kColor estiver definido como laranja e o arquivo tiver a etiqueta vermelha, o Finder exibirá círculos vermelho e laranja. Você pode definir o sinalizador kColor com AppleScript:

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")' é uma sintaxe plist antiga para isso:

<?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-29imprime o valor dos bits usados ​​para o sinalizador kColor. Vermelho é C, laranja é E, amarelo é A, verde é 4, azul é 8, magenta é 6 e cinza é 2. (O sinalizador que adicionaria 1 aos valores não é usado no OS X.)

Lri
fonte
são as "tags images" .PNGs ou gráficos com cores? não poderia encontrar algo como "C.png" no disco rígido :)
1

A resposta foi publicada na lista de usuários da Applescript:

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


citação de código de página escrito por Shane Stanley

Você pode fazer isso facilmente com o AppleScriptObjC. Aqui estão alguns manipuladores para recuperar tags, definir tags e adicionar 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:

Se você salvá-los em uma biblioteca de scripts, também poderá usá-los no Mavericks.

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

brandelune
fonte