Mac OS X: Como alterar a etiqueta colorida dos arquivos no Terminal

16

Existe uma maneira de definir o rótulo colorido de um arquivo para alguma cor quando estiver no Terminal?

Eu sei que o comando a seguir lista algumas informações sobre qual é a cor atualmente, mas não consigo descobrir como fazer algo sobre isso. Como mudar isso.

mdls -name kMDItemFSLabel somefile.ext

A razão pela qual gostaria de saber é que desejo marcar recursivamente todos os arquivos em uma pasta de um determinado tipo com uma determinada etiqueta colorida (no meu caso, cinza).

Eu sei como fazer a descoberta:

find . -name "*.ext"

E sei como posso executar o comando posteriormente para cada arquivo usando -exec, mas preciso saber como fazer a rotulagem real ...

Eu gostaria de uma solução que envolva apenas comandos embutidos no Mac OS X. Portanto, de preferência, nada de terceiros, a menos que não haja outra maneira.

Svish
fonte

Respostas:

9

Com base nas respostas aqui e nas postagens referenciadas, criei a seguinte função e a adicionei ao meu arquivo ~ / .bash_profile:

# Definir cor da etiqueta do Finder
rótulo(){
  if [$ # -lt 2]; então
    eco "USAGE: label [0-7] arquivo1 [arquivo2] ..."
    echo "Define o rótulo do Finder (cor) para arquivos"
    eco "Cores padrão:"
    eco "0 Sem cor"
    eco "1 laranja"
    eco "2 vermelho"
    eco "3 amarelo"
    eco "4 azul"
    eco "5 roxo"
    eco "6 verde"
    eco "7 cinza"
  outro
    osascript - "$ @" << EOF
    na execução argv
        defina labelIndex como (item 1 de argv como número)
        repita com i de 2 a (contagem de argumentos)
          informe ao aplicativo "Finder"
              defina theFile como arquivo POSIX (item i do argv) como alias
              definir o índice de rótulo doArquivo para labelIndex
          fim de contar
        repetição final
    corrida final
EOF
  fi
}
>

Robert Harder
fonte
4

Os métodos osascript parecem estar corrompidos no Mavericks AppleScript, mas isso parece funcionar:

xattr -wx com.apple.FinderInfo "0000000000000000000C00000000000000000000000000000000000000000000" /path/to/your/file

No Mavericks, isso parece mesclar o rótulo do arquivo com o anterior (como agora são "tags") e, da mesma forma, eu esperaria que o descrito acima se rompa em algum momento se a Apple parar de usar atributos estendidos dessa maneira. Mas tem a vantagem de trabalhar para mim agora e ser muito mais rápido que o AS.

Piersg
fonte
Oh meu Deus, esse é o comando.
Nathancahill
3

osascript -e "diga ao app \" Finder \ "para definir o índice do rótulo do arquivo POSIX (\" / junk.txt \ ") para 1"

Dave
fonte
osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 E se junk.txt for realmente my full/path/with spaces.txtarmazenado em uma variável chamada $fileName Eu tentei inúmeras sintaxes e aspas simples, aspas duplas ... e nenhuma delas funcione.
Você escapar-lo com barras invertidas:File\ with\ Spaces.txt
msanford
3

Aqui está a minha versão, baseada nos dois de @Lauri e @Robert. Você especifica a cor usando o nome da cor, não o número. Os nomes das cores são consistentes com a saída de hfsdata -L, então você usa "Nenhuma" para atribuir nenhuma cor ao arquivo. Salve isso em um arquivo chamado "setlabel" e faça chmod 755 setlabel.

#!/bin/bash
# Set Finder label color
  if [ $# -lt 2 ]; then                                                       
    echo "USAGE: setlabel color file1 [file2] ..."
    echo "Sets the Finder label (color) for files"
    echo "Possible colors: None Orange Red Yellow Blue Purple Green Gray"
  else
  labelargs=$@
  color=$1
  file=$2
  colorarray=( None Orange Red Yellow Blue Purple Green Gray )
  colorvalue=8
  for i in {0..7}
     do
      if [ "${color}" == ${colorarray[${i}]} ]
      then
         colorvalue=${i}
      fi
     done
  if [ "${colorvalue}" == "8" ]
      then
         echo Color ${color} is not recognized.
     echo "Possible colors: None Orange Red Yellow Blue Purple Green Gray"
     else
    osascript - ${colorvalue} ${file} << EOF >/dev/null 2>&1
    on run argv
        set labelIndex to (item 1 of argv as number)
        repeat with i from 2 to (count of argv)
          tell application "Finder"
              set theFile to POSIX file (item i of argv) as alias
              set label index of theFile to labelIndex
          end tell
        end repeat
    end run
EOF
    fi
  fi
Lee
fonte
Você pode editar sua resposta para referenciar as outras respostas pelos nomes de seus autores. "Os dois acima" são potencialmente inúteis, pois um usuário pode ordenar essas postagens de maneira diferente, se desejar.
JoshP
1

Para visualizá-los no Finder (eu sei, não o que você pediu), você pode usar xattr -l ou xattr -p com.apple.FinderInfo, você obtém uma bandeira entre os zeros (1E), dos quais os bits inferiores são os cor .. Com coisas de terceiros: hfsdebug (use com sudo) para obter muitas informações, entre as quais uma etiqueta de cor legível.

Para alterá-los com coisas de terceiros: osxutils possui um comando setlabel.

Henno
fonte
Infelizmente, osxutils é apenas PPC.
1

Isso usaria a mesma ordem para as cores do Finder.

#!/bin/bash

if [[ $# -le 1 || ! "$1" =~ ^[0-7]$ ]]; then
  echo "usage: label 01234567 FILE..." 1>&2
  exit 1
fi

colors=( 0 2 1 3 6 4 5 7 )
n=${colors[$1]}
shift

osascript - "$@" <<END > /dev/null 2>&1
on run arguments
tell app "Finder"
repeat with f in arguments
set f to (posix file (contents of f) as alias)
set label index of f to $n
end
end
end
END

O stderr é redirecionado porque a conversão de um caminho relativo em um alias resulta em um aviso como CFURLGetFSRef que foi passado nesta URL que não possui esquema na versão 10.8. stdout é redirecionado porque o osascript imprime o valor da última expressão.

Lri
fonte
1

Adoro esses scripts, no entanto, eles não estavam trabalhando para meus arquivos que usavam espaços em seus nomes até eu alterar a configuração do IFS para bash no script, também alterei a entrada do arquivo para aceitar um arquivo de texto com uma lista de nomes de arquivos:

#!/bin/bash
# Set Finder label color of files in a list
# set the Internal Field Separator to \n (newline)
IFS=$'\n'
  if [ $# -lt 2 ]; then                                                       
    echo "USAGE: LabelFilelist color Path/to/filelist ..."
    echo "Sets the Finder label (color) for files"
    echo "Possible colors: None Orange Red Yellow Blue Purple Green Gray"
  else

 labelargs=$@
  color=$1
  file=`cat < $2`
  colorarray=( None Orange Red Yellow Blue Purple Green Gray )
  colorvalue=8
  for i in {0..7}
     do
      if [ "${color}" == ${colorarray[${i}]} ]
      then
         colorvalue=${i}
      fi
     done
  if [ "${colorvalue}" == "8" ]
      then
         echo Color ${color} is not recognized.
     echo "Possible colors: None Orange Red Yellow Blue Purple Green Gray"
     else
    osascript - ${colorvalue} ${file} << EOF >/dev/null 2>&1
    on run argv
        set labelIndex to (item 1 of argv as number)
        repeat with i from 2 to (count of argv)
          tell application "Finder"
              set theFile to POSIX file (item i of argv) as alias
              set label index of theFile to labelIndex
          end tell
        end repeat
    end run
EOF
    fi
  fi
jpetersen
fonte
0

Aqui estão dois artigos que descrevem como fazer isso usando o AppleScript, que por sua vez, pode ser chamado na linha de comando.

Como definir o rótulo de cores via Terminal ou AppleScript
e
marcar arquivos com cores no os-x finder a partir de scripts de shell .

JRobert
fonte
como você chamaria isso de uma linha de comando?
Svish
No AppleScript Editor, você pode compilar e salvar um script como um aplicativo. Você pode executar isso especificando seu caminho. Você pode executar na linha do AppleScript precedendo-o com "osascript" e citando o comando Applescript. O citando pode ficar complexo, às vezes ...
JRobert