Mac OS X: jak zmienić kolorową etykietę plików w terminalu

16

Czy istnieje sposób, aby ustawić kolor etykiety pliku na jakiś kolor, gdy jest on w terminalu?

Wiem, że następujące polecenie wyświetla informacje o tym, jaki jest obecnie kolor, ale nie mogę wymyślić, jak coś z tym zrobić. Jak to zmienić.

mdls -name kMDItemFSLabel somefile.ext

Powodem, dla którego chciałbym wiedzieć, jest to, że chcę rekurencyjnie oznaczać wszystkie pliki w folderze określonego typu za pomocą określonej kolorowej etykiety (w moim przypadku szarej).

Wiem, jak to zrobić:

find . -name "*.ext"

Wiem, jak mogę później uruchomić polecenie dla każdego pliku -exec, ale muszę wiedzieć, jak wykonać właściwe etykietowanie ...

Chciałbym rozwiązania, które dotyczy tylko poleceń wbudowanych w system Mac OS X. Dlatego najlepiej nie ma żadnych programów innych firm, chyba że nie ma innego wyjścia.

Svish
źródło

Odpowiedzi:

9

W oparciu o odpowiedzi tutaj i w odnośnikach, stworzyłem następującą funkcję i dodałem ją do mojego pliku ~ / .bash_profile:

# Ustaw kolor etykiety Findera
etykieta(){
  jeśli [$ # -lt 2]; następnie
    echo „UŻYCIE: etykieta [0-7] plik1 [plik2] ...”
    echo „Ustawia etykietę (kolor) Findera dla plików”
    echo „Domyślne kolory:”
    echo „0 Brak koloru”
    echo „1 pomarańczowy”
    echo „2 czerwone”
    echo „3 żółte”
    echo „4 niebieskie”
    echo „5 fioletowych”
    echo „6 zielony”
    echo „7 Gray”
  jeszcze
    osascript - „$ @” << EOF
    w biegu argv
        ustaw wartość labelIndex na (pozycja 1 argumentu jako liczba)
        powtórz za pomocą i od 2 do (liczba argv)
          powiedz aplikacji „Finder”
              ustaw plik na POSIX (pozycja i argv) jako alias
              ustaw indeks etykiety pliku na wartość labelIndex
          koniec powiedz
        koniec powtórz
    koniec biegu
EOF
  fi
}
>

Robert Harder
źródło
4

Wydaje się, że metody osascript są zepsute w Applever Mavericks, ale wydaje się, że to działa:

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

Pod Mavericks wydaje się to łączyć etykietę pliku z poprzednią (ponieważ są to teraz „tagi”) i tym samym, spodziewałbym się, że powyższe pęknie w pewnym momencie, jeśli Apple przestanie używać rozszerzonych atrybutów w ten sposób. Ale ma tę zaletę, że pracuje dla mnie teraz i jest o wiele szybszy niż AS.

Piersg
źródło
O rany, to całkiem rozkaz.
nathancahill
3

osascript -e „powiedz aplikacji \” Finder \ ”, aby ustawić indeks etykiety pliku POSIX (\" / junk.txt \ ") na 1"

Dave
źródło
osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 Co jeśli plik junk.txt jest naprawdę my full/path/with spaces.txtprzechowywany w zmiennej o nazwie $fileName Próbowałem niezliczonych składni i pojedynczych cudzysłowów, podwójnych cudzysłowów ... i żadna z nich nie działa.
File\ with\ Spaces.txt
Uciekasz
3

Oto moja wersja, oparta na dwóch z @Lauri i @Robert. Kolor określasz za pomocą nazwy koloru, a nie liczby. Nazwy kolorów są zgodne z danymi wyjściowymi hfsdata -L, więc używasz „Brak”, aby nie przypisywać koloru do pliku. Zapisz to w pliku o nazwie „setlabel” i zrób to 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
Zawietrzny
źródło
Możesz zredagować swoją odpowiedź, aby odwoływała się do innych odpowiedzi przez @names ich autorów. „Dwa powyższe” jest potencjalnie bezużyteczne, ponieważ użytkownik może inaczej zamówić te posty.
JoshP
1

Aby wyświetlić je w Finderze (wiem, że nie to, o co prosiłeś), możesz użyć xattr -l lub xattr -p com.apple.FinderInfo, otrzymasz flagę pomiędzy zerami (1E), których dolne bity to color .. Z materiałami innych firm: hfsdebug (użyj z sudo), aby uzyskać wiele informacji, w tym czytelną etykietę koloru.

Aby zmienić je za pomocą rzeczy trzeciej części: osxutils ma polecenie setlabel.

Henno
źródło
Niestety osxutils to tylko PPC.
1

Użyłoby to tej samej kolejności kolorów co 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 jest przekierowywany, ponieważ konwersja ścieżki względnej na alias powoduje ostrzeżenie, takie jak CFURLGetFSRef przekazano ten adres URL, który nie ma schematu na 10.8. standardowe wyjście jest przekierowywane, ponieważ osascript drukuje wartość ostatniego wyrażenia.

Lri
źródło
1

Uwielbiam te skrypty, jednak nie działały one dla moich plików, które używały spacji w swoich nazwach, dopóki nie zmieniłem ustawienia IFS dla bash w skrypcie, a także zmieniłem wejście pliku, aby zaakceptować plik tekstowy z listą nazw plików:

#!/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
źródło
0

Oto dwa artykuły opisujące, jak to zrobić za pomocą AppleScript, które z kolei można wywołać z wiersza poleceń.

Jak ustawić kolorową etykietę za pomocą terminalu lub skryptu jabłkowego
i
oznaczać pliki kolorami w wyszukiwarce os-x ze skryptów powłoki .

JRobert
źródło
jak nazwałbyś to z linii poleceń?
Svish,
W AppleScript Editor można skompilować i zapisać skrypt jako aplikację. Możesz to uruchomić, określając jego ścieżkę. Możesz uruchomić linię AppleScript, poprzedzając ją „osascript” i cytując polecenie Applescript.
Cytowanie