2010-09-26 13 views
6

Có ai biết nếu có thể chỉnh sửa trực tiếp siêu dữ liệu tệp trên OS X. Cụ thể là trong perl. Thông số tôi đang cố gắng thay đổi là kMDItemFSLabel (Màu của tệp). Tôi đã có một tìm kiếm xung quanh và tôi dường như không thể tìm thấy một cách để làm điều này mà không cần sử dụng một mô-đun như Mac::Glue hoặc một ứng dụng bên ngoài (Finder).Tôi làm cách nào để chỉnh sửa siêu dữ liệu tệp trong OS X?

Trả lời

9

Thuộc tính kMDItemFSLabel là thuộc tính của Trình tìm kiếm. Bạn cần phải sử dụng một cách để giao tiếp với Finder để thay đổi dữ liệu của nó. Theo như tôi biết, không có chút bạn có thể twiddle với Perl để thay đổi dữ liệu của Finder mà không đi qua Finder.

Có một số cách để làm điều này:

  1. Sử dụng CamelBones khi phiên bản mới đi ra. Điều đó cho phép một cây cầu đến Objective C từ Perl. Sau đó, bạn sẽ cần phải sử dụng phương pháp Apple với các cuộc gọi hệ thống Cocoa. đường cong dốc học tập cho ca cao ...

  2. Nếu bạn có các công cụ phát triển, sử dụng/Developer/Công cụ/SetFile (nếu có hỗ trợ các mục metadata)

  3. Sử dụng osascript để gửi thông điệp tới Finder để thay đổi màu của tập tin. Bạn có thể xem this bài viết SO trước đó để biết các gợi ý khi thực hiện điều đó.

Hầu hết các mục tiêu liên quan đến Perl C/Cocoa cầu đã qua đời không may. MacPerl chưa được cập nhật kể từ năm 2005.

Hầu như tất cả các phương pháp đơn giản nhất đều cần biết số lượng tối thiểu của bản tóm tắt và gọi văn bản của tập lệnh đó mặc dù cuộc gọi kiểu nội suy là osascript.

Ở dạng 1 dòng của nó, làm cho osascript Perl trông đẹp:

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

Để sử dụng osascript từ Perl, hầu hết sử dụng một tài liệu ĐÂY. Có những ví dụ từ cuốn sách tôi đã gọi là Applescript - The Definitive Guide và từ brian d foy on Controlling iTunes with Perl.

Dưới đây là một kịch bản trong Perl tôi đã viết cho thiết màu tập tin sử dụng 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); 

Nếu màu Finder là 0, kMDItemFSLabel là 0. Nếu có bất kỳ thiết lập màu sắc, kMDItemFSLabel trở thành 8 màu. tức là, nhãn "cam" là label index 1, kMDItemFSLabel = 7; nhãn "màu đỏ" là label index 2, kMDItemFSLabel = 6; và vân vân.

+0

Cảm ơn bạn đã câu trả lời tuyệt vời. Đây chính xác là những gì tôi đang tìm kiếm. –

+0

Bạn được chào đón – dawg

1

Không có chức năng tích hợp trong Perl để hoạt động trên siêu dữ liệu hệ thống tệp Mac. Hoặc là bạn sử dụng một thư viện từ CPAN, hoặc viết nó cho mình, có lẽ không phải là cũng như tác giả của một trong CPAN đã làm.

1

Nó thực sự không phức tạp để thực hiện. Bạn có thể sử dụng lệnh xattr như thể hiện trong chuỗi doc dưới đây ... Tôi đã bọc các chức năng cơ bản trong một kịch bản python mà áp dụng màu sắc được ghi tên vào một loạt các tập tin ...

#!/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))