2010-09-26 25 views
6

Qualcuno sa se è possibile modificare direttamente i metadati del file su OS X. Specificamente in perl. Il parametro che sto specificatamente cercando di cambiare è kMDItemFSLabel (il colore del file). Ho avuto una ricerca in giro e non riesco a trovare un modo per farlo senza utilizzare un modulo come Mac::Glue o un'applicazione esterna (Finder).Come posso modificare i metadati dei file in OS X?

risposta

9

L'attributo kMDItemFSLabel è una proprietà del Finder. È necessario utilizzare un modo per comunicare con il Finder per modificare i suoi dati. Per quanto ne so, non c'è niente che tu possa giocare con Perl per cambiare i dati del Finder senza passare attraverso il Finder.

Ci sono diversi modi per farlo:

  1. Utilizzare CamelBones quando la nuova versione viene fuori. Ciò consente a un bridge di raggiungere l'obiettivo C da Perl. Quindi dovrai utilizzare il metodo Apple con le chiamate di sistema Cocoa. ripida curva di apprendimento per Cacao ...

  2. Se si dispone di strumenti di sviluppo, uso/Developer/Tools/SetFile (se questo supporta l'elemento di metadati)

  3. Usa osascript per inviare il messaggio al Finder di cambiare il colore del file. Puoi dare un'occhiata a this in un post precedente per suggerimenti su come farlo.

La maggior parte dei ponti C/Cocoa legati all'obiettivo Perl sono morti purtroppo. MacPerl non è stato aggiornato dal 2005.

Quasi tutti i metodi più semplici richiedono di conoscere almeno una quantità minima di Applescript e di chiamare il testo di tale script tramite una chiamata di tipo interpolato a osascript.

Nella sua forma 1 riga, osascript rende Perl sembrare bello:

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

Per utilizzare osascript da Perl, la maggior parte utilizza un documento QUI. Ci sono esempi da I libro che ho chiamato Applescript - The Definitive Guide e da brian d foy on Controlling iTunes with Perl.

Ecco uno script in Perl che ho scritto per l'impostazione del colore file usando 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); 

Se il colore Finder è 0, kMDItemFSLabel è 0. Se non v'è alcun set di colori, kMDItemFSLabel diventa a 8 colori. per esempio, l'etichetta "orange" è label index 1, kMDItemFSLabel = 7; l'etichetta "rosso" è label index 2, kMDItemFSLabel = 6; e così via.

+0

Grazie per il risposta fantastica Questo era esattamente quello che stavo cercando. –

+0

Prego – dawg

1

Non esiste alcuna funzione incorporata in Perl per operare sui metadati del filesystem Mac. O usi una libreria da CPAN, o scrivi tu stesso, probabilmente non così bene come ha fatto l'autore di CPAN.

1

In realtà non è così complicato da implementare. È possibile utilizzare il comando xattr come mostrato nella stringa doc sotto ... Ho avvolto la funzione di base in uno script python che si applica i colori con nome ad una serie di file ...

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