Mac OS X: So ändern Sie die Farbbezeichnung von Dateien über das Terminal

16

Kann ich das Farbetikett einer Datei im Terminal auf eine bestimmte Farbe einstellen?

Ich weiß, dass der folgende Befehl einige Informationen über die aktuelle Farbe auflistet, aber ich kann nicht herausfinden, wie ich etwas dagegen tun soll. Wie es zu ändern.

mdls -name kMDItemFSLabel somefile.ext

Der Grund, den ich wissen möchte, ist, dass ich alle Dateien in einem Ordner eines bestimmten Typs mit einem bestimmten Farbetikett (in meinem Fall grau) rekursiv markieren möchte.

Ich weiß, wie ich das finde:

find . -name "*.ext"

Und ich weiß, wie ich den Befehl anschließend für jede Datei mit ausführen kann -exec, aber ich muss wissen, wie die eigentliche Beschriftung erfolgt ...

Ich hätte gerne eine Lösung, die nur Befehle beinhaltet, die in Mac OS X integriert sind. Also vorzugsweise keine Sachen von Drittanbietern, es sei denn, es gibt keinen anderen Weg.

Svish
quelle

Antworten:

9

Basierend auf den Antworten hier und in referenzierten Beiträgen habe ich die folgende Funktion ausgeführt und sie meiner ~ / .bash_profile-Datei hinzugefügt:

# Stellen Sie die Finder-Etikettenfarbe ein
Etikette(){
  if [$ # -lt 2]; dann
    echo "USAGE: label [0-7] file1 [file2] ..."
    echo "Legt die Finder-Bezeichnung (Farbe) für Dateien fest"
    echo "Standardfarben:"
    Echo "0 keine Farbe"
    Echo "1 Orange"
    echo "2 rot"
    echo "3 gelb"
    echo "4 blau"
    Echo "5 Purple"
    echo "6 grün"
    Echo "7 Grey"
  sonst
    osascript - "$ @" << EOF
    on run argv
        setze labelIndex auf (Item 1 von argv als Nummer)
        wiederhole mit i von 2 bis (Anzahl argv)
          Anwendung "Finder" mitteilen
              setze theFile auf POSIX file (Item i von argv) als Alias
              setze label index of theFile auf labelIndex
          Ende erzählen
        Ende wiederholen
    Lauf beenden
EOF
  fi
}
>

Robert Harder
quelle
4

Die osascript-Methoden scheinen in Mavericks AppleScript fehlerhaft zu sein, aber dies scheint zu funktionieren:

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

Unter Mavericks scheint dies die Dateibezeichnung mit der vorherigen zu verschmelzen (da sie jetzt "Tags" sind), und aus dem gleichen Grund würde ich davon ausgehen, dass das oben Gesagte irgendwann abbricht, wenn Apple die erweiterten Attribute auf diese Weise nicht mehr verwendet. Aber es hat den Vorteil, jetzt für mich zu arbeiten und viel schneller zu sein als AS.

Piersg
quelle
Oh mein Gott, das ist schon der Befehl.
NathanCahill
3

osascript -e "sage der App \" Finder \ ", dass sie den Beschriftungsindex der POSIX-Datei (\" / junk.txt \ ") auf 1 setzen soll"

Dave
quelle
osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 Was ist, wenn junk.txt wirklich my full/path/with spaces.txtin einer Variablen namens gespeichert ist? $fileName Ich habe unzählige Syntaxen und einfache Anführungszeichen, doppelte Anführungszeichen ... ausprobiert und keine davon funktioniert.
Sie entkommen mit Backslashes:File\ with\ Spaces.txt
Msanford
3

Hier ist meine Version, basierend auf den beiden von @Lauri und @Robert. Sie bestimmen die Farbe anhand des Farbnamens, nicht anhand der Nummer. Die Farbnamen stimmen mit der Ausgabe von überein hfsdata -L, sodass Sie "Keine" verwenden, um der Datei keine Farbe zuzuweisen. Speichern Sie dies in einer Datei namens "setlabel" und machen Sie 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
quelle
Sie können Ihre Antwort bearbeiten, um die anderen Antworten nach den @ -Namen der Autoren zu referenzieren. "Die beiden oben genannten" sind möglicherweise nutzlos, da ein Benutzer diese Beiträge anders bestellen kann, wenn er möchte.
JoshP
1

Um sie im Finder anzuzeigen (ich weiß nicht, was Sie gefragt haben), können Sie xattr -l oder xattr -p com.apple.FinderInfo verwenden. Sie erhalten ein Flag zwischen den Nullen (1E), von denen die unteren Bits die sind color .. Mit Sachen von Drittanbietern : hfsdebug (mit sudo verwenden), um viele Informationen zu erhalten, darunter ein lesbares Farbetikett .

So ändern Sie sie mit Sachen aus dem dritten Teil: osxutils hat einen Befehl setlabel.

Henno
quelle
Leider ist osxutils nur PPC.
1

Dies würde die gleiche Reihenfolge für die Farben wie Finder verwenden.

#!/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 wird umgeleitet, da das Konvertieren eines relativen Pfads in einen Alias ​​zu einer Warnung führt, bei der CFURLGetFSRef an diese URL übergeben wurde, für die in 10.8 kein Schema vorhanden ist . stdout wird umgeleitet, weil osascript den Wert des letzten Ausdrucks ausgibt.

Lri
quelle
1

Ich liebe diese Skripte, aber sie funktionierten nicht für meine Dateien, die Leerzeichen in ihren Namen verwendeten, bis ich die IFS-Einstellung für Bash innerhalb des Skripts änderte. Außerdem änderte ich die Dateieingabe, um eine Textdatei mit einer Liste von Dateinamen zu akzeptieren:

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

In den folgenden zwei Artikeln wird beschrieben, wie dies mithilfe von AppleScript geschehen kann, das wiederum über die Befehlszeile aufgerufen werden kann.

So richten Farbetiketten über Terminal oder Applescript
und
Tagging - Dateien mit Farben in os-x - Finder von Shell - Skripten .

JRobert
quelle
Wie würden Sie das von einer Kommandozeile aus aufrufen?
Svish
Im AppleScript Editor können Sie ein Skript als Anwendung kompilieren und speichern. Sie können dies ausführen, indem Sie den Pfad angeben. Sie können AppleScript verwenden, indem Sie "osascript" voranstellen und den Befehl "Applescript" in Anführungszeichen setzen. Das Zitat kann manchmal komplex werden ...
JRobert