2010-09-26 15 views
6

¿Alguien sabe si es posible editar directamente metadatos de archivos en OS X. Específicamente en perl. El parámetro que estoy intentando cambiar específicamente es kMDItemFSLabel (El color del archivo). He tenido una búsqueda y parece que no puedo encontrar una manera de hacerlo sin usar un módulo como Mac::Glue o una aplicación externa (Finder).¿Cómo puedo editar los metadatos de archivos en OS X?

Respuesta

9

El atributo kMDItemFSLabel es propiedad del Finder. Debe usar una forma de comunicarse con el Finder para cambiar sus datos. Por lo que yo sé, no hay nada que puedas mezclar con Perl para cambiar los datos del Finder sin pasar por el Buscador.

Hay varias maneras de hacer esto:

  1. Uso CamelBones cuando la nueva versión sale. Eso permite un puente al Objetivo C desde Perl. Entonces necesitarás usar el método de Apple con llamadas al sistema Cocoa. empinada curva de aprendizaje para cacao ...

  2. Si tiene herramientas de desarrollo, uso/Developer/Herramientas/SetFile (si es que se apoya el elemento de metadatos)

  3. Uso osascript para enviar el mensaje al Finder para cambiar el color del archivo. Puede consultar this publicaciones anteriores de SO para obtener sugerencias sobre cómo hacerlo.

La mayoría de los puentes relacionados con Perl C/Cocoa han muerto por desgracia. MacPerl no se ha actualizado desde 2005.

Casi todos los métodos más sencillos requieren conocer al menos una cantidad mínima de Applescript y llamar al texto de ese script mediante una llamada de tipo interpolado al osascript.

En su forma 1 línea, osascript hace Perl lucir bella:

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

Para utilizar osascript de Perl, la mayoría utiliza un documento AQUÍ. Hay ejemplos de I book que he llamado Applescript - The Definitive Guide y de brian d foy on Controlling iTunes with Perl.

Aquí es un script en Perl que escribí para el ajuste de color de archivos utilizando 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); 

Si el color Finder es 0, kMDItemFSLabel es 0. Si hay algún juego de colores, kMDItemFSLabel se convierte en 8 colores. es decir, la etiqueta "naranja" es label index 1, kMDItemFSLabel = 7; la etiqueta "roja" es label index 2, kMDItemFSLabel = 6; y así.

+0

Gracias por la respuesta increíble Esto era exactamente lo que estaba buscando. –

+0

De nada – dawg

1

No hay una función incorporada en Perl para operar en los metadatos del sistema de archivos Mac. O bien utiliza una biblioteca de CPAN, o la escribe usted mismo, probablemente no tan bien como lo hizo el autor de la de CPAN.

1

En realidad no es tan complicado de implementar. Puede utilizar el comando xattr como se muestra en la cadena de documentación a continuación ... me he envuelto la función básica de un script en Python que se aplica colores con nombre a una serie de archivos ...

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