2010-09-26 7 views
6

क्या किसी को पता है कि ओएस एक्स पर फ़ाइल मेटाडेटा को सीधे संपादित करना संभव है या नहीं। विशेष रूप से perl में। पैरामीटर जिसे मैं विशेष रूप से बदलने की कोशिश कर रहा हूं kMDItemFSLabel (फ़ाइल का रंग) है। मेरे पास एक खोज है और मुझे Mac::Glue या बाहरी एप्लिकेशन (फाइंडर) जैसे मॉड्यूल का उपयोग किए बिना ऐसा करने का कोई तरीका नहीं दिख रहा है।मैं ओएस एक्स में फ़ाइल मेटाडेटा कैसे संपादित कर सकता हूं?

उत्तर

9

kMDItemFSLabel विशेषता खोजक की एक संपत्ति है। आपको अपने डेटा को बदलने के लिए खोजक के साथ संवाद करने के लिए एक तरीका का उपयोग करने की आवश्यकता है। जहां तक ​​मुझे पता है, खोजक के माध्यम से बिना खोजक के डेटा को बदलने के लिए पर्ल के साथ आप कुछ भी नहीं कर सकते हैं।

  1. उपयोग CamelBones नया संस्करण बाहर आता है जब:

    ऐसा करने के कई तरीके हैं। यह पर्ल से उद्देश्य सी के लिए एक पुल की अनुमति देता है। फिर आपको कोको सिस्टम कॉल के साथ ऐप्पल विधि का उपयोग करने की आवश्यकता होगी। कोको के लिए खड़ी सीखने की अवस्था ...

  2. आप डेवलपर उपकरण, उपयोग/डेवलपर/उपकरण है, तो/SetFile (मेटाडेटा आइटम समर्थन करता है)

  3. उपयोग osascript खोजक करने के लिए संदेश भेजने के लिए बदलने के लिए फ़ाइल का रंग आप इसे करने पर संकेतों के लिए this पहले एसओ पोस्ट देख सकते हैं।

दुर्भाग्य से पर्ल से संबंधित उद्देश्य सी/कोको पुलों की अधिकांश मृत्यु हो गई है। मैकपर्ल 2005 से अपडेट नहीं किया गया है।

लगभग सभी सबसे आसान तरीकों को कम से कम न्यूनतम मात्रा में एप्पलस्क्रिप्ट जानने और उस स्क्रिप्ट के पाठ को कॉल करने की आवश्यकता होती है, हालांकि osascript पर एक इंटरप्लाटेड प्रकार कॉल।

अपने 1 लाइन रूप में, osascript बनाता पर्ल खूबसूरत दिखना:

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

पर्ल से osascript का उपयोग करने के लिए, सबसे एक यहाँ दस्तावेज़ का उपयोग करें। I पुस्तक के उदाहरण हैं जिन्हें मैंने Applescript - The Definitive Guide और brian d foy on Controlling iTunes with Perl से बुलाया है। ,

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

खोजक रंग 0 है, तो kMDItemFSLabel 0. है अगर वहाँ किसी भी रंग सेट है kMDItemFSLabel 8-रंग हो जाता है:

यहाँ एक स्क्रिप्ट पर्ल में मैं osascript का उपयोग कर फ़ाइल रंग स्थापित करने के लिए लिखा है। यानी, लेबल "नारंगी" label index 1, kMDItemFSLabel = 7 है; लेबल "लाल" label index 2, kMDItemFSLabel = 6 है; और इसी तरह।

+0

के लिए धन्यवाद भयानक जवाब। यह ठीक वही है जिसकी मुझे तलाश थी। –

+0

आपका स्वागत है – dawg

1

मैक फाइल सिस्टम मेटाडेटा पर संचालित करने के लिए पर्ल में कोई अंतर्निहित फ़ंक्शन नहीं है। या तो आप सीपीएएन से लाइब्रेरी का उपयोग करते हैं, या इसे स्वयं लिखते हैं, शायद सीपीएएन में किसी के लेखक के साथ ही नहीं।

1

वास्तव में यह लागू करने के लिए जटिल नहीं है। नीचे के रूप में दस्तावेज़ स्ट्रिंग में दिखाया गया है आप xattr आदेश का उपयोग कर सकते हैं ... मैं फ़ाइलों की एक श्रृंखला के लिए नामित रंग लागू होता है जो एक अजगर स्क्रिप्ट में बुनियादी कार्य लपेटा है ...

#!/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)) 
संबंधित मुद्दे