Mac OS X: comment changer l'étiquette de couleur des fichiers à partir du terminal

16

Existe-t-il un moyen de définir l'étiquette de couleur d'un fichier sur une certaine couleur dans le terminal?

Je sais que la commande suivante répertorie des informations sur la couleur actuelle, mais je ne sais pas comment y remédier. Comme changer.

mdls -name kMDItemFSLabel somefile.ext

La raison pour laquelle je voudrais savoir est que je veux marquer de manière récursive tous les fichiers d'un dossier d'un certain type avec une certaine étiquette de couleur (dans mon cas, le gris).

Je sais comment faire la constatation:

find . -name "*.ext"

Et je sais comment je peux exécuter la commande par la suite pour chaque fichier à l'aide -exec, mais j'ai besoin de savoir comment faire l'étiquetage réel ...

Je voudrais une solution qui n'implique que des commandes intégrées à Mac OS X. Donc, de préférence pas de trucs tiers, sauf s'il n'y a pas d'autre moyen.

Svish
la source

Réponses:

9

Sur la base des réponses ici et dans les articles référencés, j'ai créé la fonction suivante et l'ai ajoutée à mon fichier ~ / .bash_profile:

# Définir la couleur de l'étiquette du Finder
étiquette(){
  if [$ # -lt 2]; ensuite
    echo "USAGE: label [0-7] file1 [file2] ..."
    echo "Définit le libellé du Finder (couleur) pour les fichiers"
    echo "Couleurs par défaut:"
    écho "0 Pas de couleur"
    écho "1 Orange"
    écho "2 Red"
    écho "3 jaune"
    écho "4 Blue"
    écho "5 Violet"
    écho "6 vert"
    écho "7 Grey"
  autre
    osascript - "$ @" << EOF
    on run argv
        définissez labelIndex sur (élément 1 de argv comme numéro)
        répéter avec i de 2 à (nombre d'argv)
          dire à l'application "Finder"
              définissez leFichier sur le fichier POSIX (élément i d'argv) comme alias
              définir l'index d'étiquette de theFile sur labelIndex
          fin dire
        répéter la fin
    moyen détourné
EOF
  Fi
}
>

Robert Harder
la source
4

Les méthodes osascript semblent cassées dans Mavericks AppleScript, mais cela semble fonctionner:

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

Sous Mavericks, cela semble fusionner l'étiquette du fichier avec la précédente (car ils sont maintenant des "balises") et du même coup, je m'attendrais à ce que ce qui précède se brise à un moment donné si Apple cessait d'utiliser les attributs étendus de cette manière. Mais il a l'avantage de travailler pour moi maintenant et d'être beaucoup plus rapide que AS.

Piersg
la source
Oh mon Dieu, c'est tout à fait la commande.
nathancahill
3

osascript -e "dites à l'application \" Finder \ "de définir l'index d'étiquette du fichier POSIX (\" / junk.txt \ ") à 1"

Dave
la source
osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 Et si junk.txt est vraiment my full/path/with spaces.txtet stocké dans une variable appelée $fileName J'ai essayé d'innombrables syntaxes et guillemets simples, guillemets doubles ... et aucune d'entre elles ne fonctionne.
Vous y échappez avec des barres obliques inverses:File\ with\ Spaces.txt
msanford
3

Voici ma version, basée sur les deux de @Lauri et @Robert. Vous spécifiez la couleur en utilisant le nom de la couleur, pas le numéro. Les noms de couleur sont cohérents avec la sortie de hfsdata -L, vous utilisez donc "Aucun" pour n'attribuer aucune couleur au fichier. Enregistrez ceci dans un fichier appelé "setlabel" et faites 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
la source
Vous pouvez modifier votre réponse pour référencer les autres réponses par les @noms de leurs auteurs. "Les deux ci-dessus" est potentiellement inutile, car un utilisateur peut commander ces messages différemment s'il le souhaite.
JoshP
1

Pour les afficher dans le Finder (je sais, pas ce que vous avez demandé), vous pouvez utiliser xattr -l ou xattr -p com.apple.FinderInfo, vous obtenez un indicateur parmi les zéros (1E), dont les bits inférieurs sont les couleur .. Avec des trucs tiers: hfsdebug (utiliser avec sudo) pour obtenir beaucoup d'informations, parmi lesquelles une étiquette de couleur lisible.

Pour les changer avec des trucs de troisième partie: osxutils a une commande setlabel.

Henno
la source
Malheureusement, osxutils est uniquement PPC.
1

Cela utiliserait le même ordre pour les couleurs 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 est redirigé car la conversion d'un chemin relatif en un alias entraîne un avertissement comme CFURLGetFSRef a été transmis à cette URL qui n'a pas de schéma sur 10.8. stdout est redirigé car osascript imprime la valeur de la dernière expression.

Lri
la source
1

J'adore ces scripts, cependant, ils ne fonctionnaient pas pour mes fichiers qui utilisaient des espaces dans leurs noms jusqu'à ce que je modifie le paramètre IFS pour bash dans le script, j'ai également changé l'entrée de fichier pour accepter un fichier texte avec une liste de noms de fichiers:

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

Voici deux articles décrivant comment faire cela en utilisant applescript, qui peut à son tour être invoqué à partir de la ligne de commande.

Comment définir une étiquette de couleur via Terminal ou applescript
et étiqueter
des fichiers avec des couleurs dans os-x finder à partir de scripts shell .

JRobert
la source
comment appelleriez-vous cela à partir d'une ligne de commande?
Svish
Dans AppleScript Editor, vous pouvez compiler et enregistrer un script en tant qu'application. Vous pouvez l'exécuter en spécifiant son chemin. Vous pouvez exécuter en ligne d'AppleScript en le précédant de "osascript" et en citant la commande Applescript. La citation peut devenir complexe, parfois ...
JRobert