Mac OS X: comment changer l'étiquette de couleur des fichiers depuis le Terminal

Existe-t-il une façon de définir l'étiquette de couleur d'un fichier à une certaine couleur dans le terminal?

Je sais que la commande suivante énumère quelques informations sur la couleur actuelle, mais je ne peux pas comprendre comment faire quelque chose. J'aime changer ça.

mdls -name kMDItemFSLabel somefile.ext 

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

Je sais comment faire la découverte:

 find . -name "*.ext" 

Et je sais comment je peux exécuter la commande ensuite pour chaque fichier en utilisant -exec , mais je dois savoir comment faire l'étiquetage réel …

Je voudrais une solution qui ne comporte que des commandes intégrées à Mac OS X. Donc, de préférence, aucun élément de tiers, à moins qu'il n'y ait pas d'autre moyen.

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

  # Couleur de l'étiquette Set Finder
 étiquette(){
   Si [$ # -lt 2];  puis
     Echo "UTILISATION: étiquette [0-7] fichier1 [fichier2] ..."
     Echo "Définit l'étiquette Finder (couleur) pour les fichiers"
     Echo "Couleurs par défaut:"
     Echo "0 Pas de couleur"
     Écho "1 Orange"
     Echo "2 Red"
     Écho "3 jaune"
     Écho "4 Bleu"
     Écho "5 Violet"
     Écho "6 vert"
     Écho "7 Gris"
   autre
     Osascript - "$ @" << EOF
     En cours d'exécution argv
         Définissez labelIndex sur (élément 1 de argv en tant que numéro)
         Répétez avec i de 2 à (nombre d'argv)
           Dire à l'application "Finder"
               Définissez le fichier File to POSIX (item i of argv) comme alias
               Définir l'index de l'étiquette du fichier sur labelIndex
           Fin dicte
         Fin de la répétition
     moyen détourné
 EOF
   Fi
 } 

>

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

Les méthodes osascript semblent brisé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 le précédent (comme ils sont maintenant des "tags") et, de la même manière, je m'attends à ce que ce qui précède se brise à un moment donné si Apple arrête les attributs étendus usin de cette façon. Mais il a l'avantage de travailler pour moi maintenant et d'être beaucoup plus rapide que l'AS.

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 couleurs sont compatibles avec la sortie de hfsdata -L , donc vous utilisez "None" pour ne pas attribuer de 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 

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 drapeau parmi les zéros (1E), dont les bits inférieurs sont les Couleur .. Avec des trucs de tiers: hfsdebug (utiliser avec sudo) pour obtenir beaucoup d'informations, parmi lesquelles une étiquette de couleur lisible.

Pour les modifier avec des éléments de la troisième partie: osxutils a une commande setlabel.

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 vers un alias entraîne un avertissement tel que CFURLGetFSRef a été passé cette URL qui n'a aucun schéma sur 10.8. Stdout est redirigé parce que osascript imprime la valeur de la dernière expression.

J'adore ces scripts, mais ils ne fonctionnaient pas pour mes fichiers qui utilisaient des espaces dans leurs noms jusqu'à ce que j'ai changé le paramètre IFS pour bash dans le script, j'ai également changé la saisie 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 

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 l'étiquette de couleur via Terminal ou applescript
et
Marquage de fichiers avec des couleurs dans os-x finder à partir de scripts shell .