Mac OS X: cómo cambiar la etiqueta de color de los archivos desde la Terminal

16

¿Hay alguna manera de configurar la etiqueta de color de un archivo en algún color cuando estoy en la Terminal?

Sé que el siguiente comando enumera información sobre el color actual, pero no puedo entender cómo hacer algo al respecto. Me gusta cambiarlo.

mdls -name kMDItemFSLabel somefile.ext

La razón por la que me gustaría saber es que quiero marcar recursivamente todos los archivos en una carpeta de cierto tipo con una determinada etiqueta de color (en mi caso, gris).

Sé cómo hacer el hallazgo:

find . -name "*.ext"

Y sé cómo puedo ejecutar el comando después para cada archivo usando -exec, pero necesito saber cómo hacer el etiquetado real ...

Me gustaría una solución que solo incluya comandos integrados en Mac OS X. Por lo tanto, preferiblemente no hay cosas de terceros, a menos que no haya otra forma.

Svish
fuente

Respuestas:

9

Basado en las respuestas aquí y en publicaciones referenciadas, hice la siguiente función y la agregué a mi archivo ~ / .bash_profile:

# Establecer el color de la etiqueta del Finder
etiqueta(){
  si [$ # -lt 2]; luego
    echo "USO: etiqueta [0-7] archivo1 [archivo2] ..."
    echo "Establece la etiqueta del Buscador (color) para los archivos"
    echo "Colores predeterminados:"
    echo "0 Sin color"
    echo "1 naranja"
    echo "2 rojo"
    echo "3 amarillo"
    echo "4 azul"
    echo "5 Púrpura"
    echo "6 verde"
    echo "7 Gray"
  más
    osascript - "$ @" << EOF
    en ejecución argv
        establezca labelIndex en (elemento 1 de argv como número)
        repita con i de 2 a (conteo de argv)
          decirle a la aplicación "Finder"
              establezca el archivo en el archivo POSIX (elemento i de argv) como alias
              establecer el índice de etiqueta del archivo en labelIndex
          final decir
        final repetir
    fin de carrera
EOF
  fi
}
>

Robert Harder
fuente
4

Los métodos osascript parecen estar rotos en Mavericks AppleScript, pero esto parece funcionar:

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

Bajo Mavericks, esto parece fusionar la etiqueta del archivo con la anterior (ya que ahora son "etiquetas") y, por la misma razón, esperaría que lo anterior se rompa en algún momento si Apple deja de usar atributos extendidos de esta manera. Pero tiene la ventaja de trabajar para mí ahora y ser mucho más rápido que AS.

Piersg
fuente
Oh dios mío, ese es todo el comando.
nathancahill
3

osascript -e "decirle a la aplicación \" Finder \ "que establezca el índice de etiqueta del archivo POSIX (\" / junk.txt \ ") en 1"

Dave
fuente
osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 ¿Qué pasa si junk.txt está realmente my full/path/with spaces.txtalmacenado en una variable llamada $fileName ? He probado innumerables sintaxis y comillas simples, comillas dobles ... y ninguna de ellas funciona.
File\ with\ Spaces.txt
Escapa
3

Aquí está mi versión, basada en los dos de @Lauri y @Robert. Especifique el color usando el nombre del color, no el número. Los nombres de los colores son consistentes con la salida de hfsdata -L, por lo que utiliza "Ninguno" para no asignar color al archivo. Guarda esto en un archivo llamado "setlabel" y hazlo 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
Sotavento
fuente
Es posible que desee editar su respuesta para hacer referencia a las otras respuestas por los nombres @ de sus autores. "Los dos anteriores" es potencialmente inútil, ya que un usuario puede ordenar estas publicaciones de manera diferente si lo desea.
JoshP
1

Para verlos en el Finder (lo sé, no lo que pediste) puedes usar xattr -l, o xattr -p com.apple.FinderInfo, obtienes un indicador entre los ceros (1E), de los cuales los bits más bajos son color .. Con material de terceros: hfsdebug (uso con sudo) para obtener mucha información, entre los cuales se encuentra una etiqueta de color legible.

Para cambiarlos con cosas de terceros: osxutils tiene un comando setlabel.

Henno
fuente
Desafortunadamente, osxutils es solo PPC.
1

Esto usaría el mismo orden para los colores que 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

stderr se redirige porque la conversión de una ruta relativa a un alias da como resultado una advertencia como CFURLGetFSRef se pasó esta URL que no tiene esquema en 10.8. stdout se redirige porque osascript imprime el valor de la última expresión.

Lri
fuente
1

Me encantan estos scripts, sin embargo, no funcionaban para mis archivos que usaban espacios en sus nombres hasta que cambié la configuración de IFS para bash dentro del script, también cambié la entrada del archivo para aceptar un archivo de texto con una lista de nombres de archivos:

#!/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
fuente
0

Aquí hay dos artículos que describen cómo hacerlo con AppleScript, que a su vez se puede invocar desde la línea de comandos.

Cómo configurar la etiqueta de color a través de Terminal o AppleScript
y
etiquetar archivos con colores en el buscador os-x desde scripts de shell .

JRobert
fuente
¿Cómo llamarías a eso desde una línea de comandos?
Svish
En AppleScript Editor, puede compilar y guardar un script como una aplicación. Puede ejecutar eso especificando su ruta. Puede ejecutar en línea AppleScript precediéndolo con "osascript" y citando el comando Applescript. La cita puede ser compleja, a veces ...
JRobert