Mac OS X: come modificare l'etichetta colorata dei file dal Terminale


16

C'è un modo in cui posso impostare l'etichetta colore di un file su un colore quando nel Terminale?

So che il seguente comando elenca alcune informazioni su quale sia attualmente il colore, ma non riesco a capire come fare qualcosa al riguardo. Come cambiarlo.

mdls -name kMDItemFSLabel somefile.ext

Il motivo che vorrei sapere è che desidero contrassegnare in modo ricorsivo tutti i file in una cartella di un determinato tipo con una determinata etichetta di colore (nel mio caso grigio).

So come fare la scoperta:

find . -name "*.ext"

E so come posso eseguire il comando in seguito per ogni file usando -exec, ma devo sapere come fare l'etichettatura effettiva ...

Vorrei una soluzione che includesse solo comandi integrati in Mac OS X. Quindi preferibilmente niente roba di terze parti, a meno che non ci sia altro modo.

Risposte:


9

Sulla base delle risposte qui e nei post di riferimento, ho creato la seguente funzione e l'ho aggiunta al mio file ~ / .bash_profile:

# Imposta il colore dell'etichetta del Finder
etichetta(){
  if [$ # -lt 2]; poi
    echo "USAGE: etichetta [0-7] file1 [file2] ..."
    echo "Imposta l'etichetta del Finder (colore) per i file"
    echo "Colori predefiniti:"
    echo "0 Nessun colore"
    echo "1 arancione"
    echo "2 rosso"
    echo "3 Giallo"
    echo "4 Blue"
    echo "5 viola"
    echo "6 verde"
    eco "7 Grigio"
  altro
    osascript - "$ @" << EOF
    in fuga argv
        imposta labelIndex su (elemento 1 di argv come numero)
        ripeti con i da 2 a (conteggio di argv)
          dire all'applicazione "Finder"
              imposta il file su POSIX file (elemento i di argv) come alias
              imposta l'indice dell'etichetta del file su labelIndex
          fine dirlo
        fine ripetizione
    fine corsa
EOF
  fi
}
>


4

I metodi osascript sembrano rotti in Mavericks AppleScript, ma questo sembra funzionare:

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

Sotto Mavericks questo sembra fondere l'etichetta del file con quella precedente (dato che ora sono "tag") e allo stesso modo mi aspetterei che quanto sopra si spezzasse a un certo punto se Apple smettesse di utilizzare gli attributi estesi in questo modo. Ma ha il vantaggio di lavorare per me ora e di essere molto più veloce di AS.


Oh mio Dio, è proprio il comando.
nathancahill,

3

osascript -e "indica all'app \" Finder \ "di impostare l'indice dell'etichetta del file POSIX (\" / junk.txt \ ") su 1"


osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 Che cosa succede se junk.txt è davvero my full/path/with spaces.txte archiviato in una variabile chiamata $fileName Ho provato innumerevoli sintassi e virgolette singole, virgolette doppie ... e nessuna di esse funziona.

File\ with\ Spaces.txt
Scappi

3

Ecco la mia versione, basata sui due di @Lauri e @Robert. Specifichi il colore usando il nome del colore, non il numero. I nomi dei colori sono coerenti con l'output di hfsdata -L, quindi si utilizza "Nessuno" per assegnare nessun colore al file. Salvalo in un file chiamato "setlabel" e fallo 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

Potresti voler modificare la tua risposta per fare riferimento alle altre risposte dai @nomi dei loro autori. "I due precedenti" è potenzialmente inutile, in quanto un utente può ordinare questi post in modo diverso se lo desidera.
JoshP,

1

Per visualizzarli nel Finder (lo so, non quello che hai chiesto) puoi usare xattr -l o xattr -p com.apple.FinderInfo, ottieni un flag tra gli zero (1E), di cui i bit inferiori sono il color .. Con materiale di terze parti: hfsdebug (usare con sudo) per ottenere molte informazioni, tra cui un'etichetta a colori leggibile.

Per cambiarli con elementi di terze parti: osxutils ha un comando setlabel.


Sfortunatamente, osxutils è solo PPC.

1

Questo userebbe lo stesso ordine per i colori di 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 viene reindirizzato perché la conversione di un percorso relativo in un alias provoca un avviso come CFURLGetFSRef a cui è stato passato questo URL che non ha uno schema su 10.8. stdout viene reindirizzato perché osascript stampa il valore dell'ultima espressione.


1

Adoro questi script, tuttavia, non funzionavano per i miei file che utilizzavano spazi nei loro nomi fino a quando non ho modificato l'impostazione IFS per bash all'interno dello script, inoltre ho modificato l'input del file per accettare un file di testo con un elenco di nomi di file:

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

0

Qui ci sono due articoli che descrivono come farlo usando applecript, che a sua volta può essere invocato dalla riga di comando.

Come impostare l'etichetta colore tramite Terminale o applecript
e
taggare i file con i colori in os-x finder dagli script della shell .


come lo chiameresti da una riga di comando?
Svish,

In AppleScript Editor, puoi compilare e salvare uno script come applicazione. Puoi eseguirlo specificandone il percorso. È possibile eseguire in linea di AppleScript precedendolo con "osascript" e citando il comando Applescript. La citazione può diventare complessa, a volte ...
JRobert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.