Как я могу редактировать метаданные файла в OS X? - PullRequest
7 голосов
/ 27 сентября 2010

Кто-нибудь знает, можно ли напрямую редактировать метаданные файла в OS X. В частности, в perl.Параметр, который я специально пытаюсь изменить, это kMDItemFSLabel (цвет файла).У меня был поиск вокруг, и я не могу найти способ сделать это без использования модуля, такого как Mac :: Glue или внешнего приложения (Finder).

Ответы [ 3 ]

10 голосов
/ 27 сентября 2010

Атрибут kMDItemFSLabel является свойством Finder.Вам нужно использовать способ связи с Finder для изменения его данных.Насколько я знаю, вы не можете ничего изменить с помощью Perl, чтобы изменить данные Finder без использования Finder.

Есть несколько способов сделать это:

  1. Использовать CamelBones , когда выйдет новая версия.Это позволяет связать Objective C с Perl.Тогда вам нужно будет использовать метод Apple с системными вызовами Cocoa.Крутая кривая обучения для Какао ...

  2. Если у вас есть инструменты разработчика, используйте / Developer / Tools / SetFile (если это поддерживает элемент метаданных)

  3. Используйте osascript для отправки сообщения в Finder, чтобы изменить цвет файла.Вы можете посмотреть на этот более ранний пост SO, чтобы узнать, как это сделать.

Большинство связанных с Perl мостов Objective C / Cocoa, к сожалению, умерли.MacPerl не обновлялся с 2005 года.

Почти все самые простые методы требуют знания хотя бы минимального количества Applescript и вызова текста этого скрипта через интерполированный вызов типа osascript .

В своей 1-строчной форме osascript делает Perl красивым:

osascript -e 'tell application "Finder"' -e "activate" -e "display dialog \"hello\"" -e 'end tell'

Чтобы использовать osascript из Perl, большинство используют документ ЗДЕСЬ.Есть примеры из I книги, которую я назвал Applescript - Полное руководство и из Брайан Д. Фой об управлении iTunes с помощью Perl .

Вот скрипт на Perl Iнаписал для установки цвета файла с помощью osascript:

#!/usr/bin/perl
use strict; use warnings;
use File::Spec;
use String::ShellQuote; 

sub osahere  { 
    my $rtr;
    my $scr='osascript -ss -e '."'".join ('',@_)."'";
    open my $fh, '-|', $scr or die "death on osascript $!";
    $rtr=do { local $/; <$fh> };
    close $fh or die "death on osascript $!";
    return $rtr;
}

sub set_file_color {
# -- No color = 0
# -- Orange = 1
# -- Red = 2
# -- Yellow = 3
# -- Blue = 4
# -- Purple = 5
# -- Green = 6
# -- Gray = 7

my $file=shift;
my $color=shift || 0;
$color=0 if $color<0;
$color=7 if $color>7;

$file=File::Spec->rel2abs($file) 
    unless File::Spec->file_name_is_absolute( $file );
$file=shell_quote($file);

return undef unless -e $file;

my $rtr=osahere <<"END_SET_COLOR" ;
tell application "Finder"
    set f to "$file"
    set ItemToLabel to POSIX file f as alias
    set the label index of ItemToLabel to $color
end tell
END_SET_COLOR

return $rtr;
}

set_file_color("2591.txt",2);

Если цвет Finder равен 0, kMDItemFSLabel равен 0. Если установлен какой-либо цвет, kMDItemFSLabel становится 8-цветным.т. е. метка «оранжевый» составляет label index 1, kMDItemFSLabel = 7;метка "красный" - label index 2, kMDItemFSLabel = 6;и так далее.

1 голос
/ 09 августа 2013

На самом деле это не так сложно реализовать.Вы можете использовать команду xattr, как показано в приведенной ниже строке документа ... Я обернул основную функцию в скрипт Python, который применяет именованные цвета к серии файлов ...

#!/usr/bin/env python

"""
==================================
LABELCOLOR.PY - Colorize Finder labels of files

Usage:
  labelcolor.py [color] *.jpg

  where color is a name or abbreviation as defined below:
    clear (c), gray (a), green (g), purple (p), 
    blue (b), yellow (y), red (r), orange (o)

The shell command used is:
  xattr -wx com.apple.FinderInfo \
  0000000000000000000400000000000000000000000000000000000000000000 myfile.txt
where 04 in the middle of the zeroes is the color definition
==================================
"""
import sys
import os
import subprocess

def colorizeFile(ColorName,FileName):
    ReverseTable = {
         "clear"  :  "01",
         "gray"   :  "03",
         "green"  :  "04",
         "purple" :  "06",
         "blue"   :  "09",
         "yellow" :  "0A",
         "red"    :  "0C",
         "orange" :  "0E",
         "c"      :  "01",
         "a"      :  "03",
         "g"      :  "04",
         "p"      :  "06",
         "b"      :  "09",
         "y"      :  "0A",
         "r"      :  "0C",
         "o"      :  "0E",
    }

    HexString = 18*"0" + ReverseTable.get(ColorName) + 44*"0"
    Xcommand = 'xattr -wx com.apple.FinderInfo {0} {1}'.format(HexString,FileName)
    ProcString = subprocess.check_call(Xcommand, stderr=subprocess.STDOUT,shell=True) 

if __name__ == "__main__":
    if len(sys.argv)<3:
        sys.stderr.write(__doc__.format(sys.argv[0]))
    else:
        Cname = sys.argv[1]
        Flist = sys.argv[2:]
        for File in Flist:
            colorizeFile(Cname.lower(),File)
        sys.stderr.write("## Colorized {0} file(s) as {1}\n".format(len(Flist),Cname))
1 голос
/ 27 сентября 2010

В Perl нет встроенной функции для работы с метаданными файловой системы Mac.Или вы используете библиотеку из CPAN, или напишите ее самостоятельно, вероятно, не так, как это делал автор из CPAN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...