16

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

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

mdls -name kMDItemFSLabel somefile.ext

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

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

find . -name "*.ext"

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

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

8 ответов8

9

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

# Set Finder label color
label(){
  if [ $# -lt 2 ]; then
    echo "USAGE: label [0-7] file1 [file2] ..."
    echo "Sets the Finder label (color) for files"
    echo "Default colors:"
    echo " 0  No color"
    echo " 1  Orange"
    echo " 2  Red"
    echo " 3  Yellow"
    echo " 4  Blue"
    echo " 5  Purple"
    echo " 6  Green"
    echo " 7  Gray"
  else
    osascript - "$@" << EOF
    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
}
>
4

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

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

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

3

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

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

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 печатает значение последнего выражения.

1

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

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

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
0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .