Mac OS X: как изменить цветовую метку файлов из Терминала

16

Есть ли способ, которым я могу установить цветовую метку файла в какой-либо цвет в терминале?

Я знаю, что следующая команда перечисляет некоторую информацию о том, какой цвет в настоящее время, но я не могу понять, как с этим что-то сделать. Как изменить это.

mdls -name kMDItemFSLabel somefile.ext

Причина, по которой я хотел бы знать, заключается в том, что я хочу рекурсивно пометить все файлы в папке определенного типа определенной цветовой меткой (в моем случае серым).

Я знаю, как сделать вывод:

find . -name "*.ext"

И я знаю, как я могу выполнить команду впоследствии для каждого файла, используя -exec, но мне нужно знать, как сделать фактическую маркировку ...

Мне бы хотелось решение, которое включает в себя только команды, встроенные в Mac OS X. Поэтому желательно никаких сторонних вещей, если нет другого пути.

Svish
источник

Ответы:

9

Основываясь на ответах здесь и в ссылках, я сделал следующую функцию и добавил ее в мой файл ~ / .bash_profile:

# Установить цвет метки Finder
метка(){
  if [$ # -lt 2]; тогда
    echo "USAGE: label [0-7] file1 [file2] ..."
    echo "Устанавливает метку Finder (цвет) для файлов"
    echo "Стандартные цвета:"
    эхо "0 Нет цвета"
    эхо "1 апельсин"
    эхо "2 красных"
    эхо "3 желтых"
    эхо "4 Blue"
    эхо "5 фиолетовых"
    эхо "6 зеленых"
    эхо "7 Грей"
  еще
    osascript - "$ @" << EOF
    на бегу argv
        установите labelIndex в (элемент 1 из argv как число)
        повторите с i от 2 до (количество argv)
          расскажите приложение "Искатель"
              установите файл в файл POSIX (элемент i из argv) в качестве псевдонима
              установить индекс метки theFile в labelIndex
          конец сказать
        конец повтора
    конец бега
EOF
  фи
}
>

Роберт Хардер
источник
4

Методы osascript в Mavericks AppleScript кажутся неработающими, но, похоже, это работает:

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

Под Mavericks это, кажется, объединяет метку файла с предыдущей (так как теперь они являются «тегами»), и по тому же признаку, я ожидаю, что вышеперечисленное сломается в какой-то момент, если Apple прекратит использование расширенных атрибутов таким способом. Но у него есть то преимущество, что я работаю сейчас и гораздо быстрее, чем AS.

Piersg
источник
Боже мой, это вполне команда.
Натанкахилл
3

osascript -e "сказать приложению \" Finder \ ", чтобы установить индекс метки файла POSIX (\" / junk.txt \ ") на 1"

Дейв
источник
osascript -e "tell app \"Finder\" to set label index of POSIX file (\"/junk.txt\") to 1 Что, если файл junk.txt действительно my full/path/with spaces.txtхранится в переменной с именем « $fileName Я перепробовал бесчисленные синтаксисы и одинарные кавычки, двойные кавычки ... и ни один из них не работает».
Вы File\ with\ Spaces.txt
избежите
3

Вот моя версия, основанная на двух из @Lauri и @Robert. Вы указываете цвет, используя название цвета, а не номер. Названия цветов соответствуют выводу hfsdata -L, поэтому вы используете «Нет», чтобы не назначать цвет файлу. Сохраните это в файле с именем "setlabel" и сделайте 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
подветренный
источник
Вы можете отредактировать свой ответ, чтобы ссылаться на другие ответы по именам их авторов. «Два выше» потенциально бесполезны, так как пользователь может заказать эти посты по-разному, если они захотят.
JoshP
1

Чтобы просмотреть их в Finder (я знаю, не то, что вы просили), вы можете использовать xattr -l или xattr -p com.apple.FinderInfo, вы получите флаг среди нулей (1E), младшие биты которого являются цвет .. С сторонним материалом: hfsdebug (используйте с sudo), чтобы получить много информации, среди которых читаемая цветная метка.

Чтобы изменить их с помощью третьей части: у osxutils есть команда setlabel.

Henno
источник
К сожалению, osxutils - это только PPC.
1

Это будет использовать тот же порядок для цветов, что и 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 перенаправлен, потому что преобразование относительного пути к псевдониму приводит к предупреждению, как CFURLGetFSRef, которому передали этот URL, который не имеет схемы на 10.8. stdout перенаправляется, потому что osascript печатает значение последнего выражения.

LRI
источник
1

Мне нравятся эти сценарии, однако они не работали для моих файлов, которые использовали пробелы в своих именах, пока я не изменил настройку IFS для bash внутри сценария, а также я изменил ввод файла, чтобы принимать текстовый файл со списком имен файлов:

#!/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
источник
0

Вот две статьи, описывающие, как это сделать с помощью appleScript, которые, в свою очередь, могут быть вызваны из командной строки.

Как установить цветовую метку через терминал или яблочный скрипт
и
пометить файлы цветами в os-x finder из сценариев оболочки .

JRobert
источник
как бы вы назвали это из командной строки?
Свиш
В редакторе AppleScript вы можете скомпилировать и сохранить скрипт как приложение. Вы можете запустить это, указав его путь. Вы можете запустить AppleScript в строке, поставив перед ним «osascript» и указав команду Applescript.
Цитирование