2010-09-26 23 views
6

Est-ce que quelqu'un sait s'il est possible de modifier directement les métadonnées de fichiers sur OS X. Plus précisément en perl. Le paramètre que j'essaie spécifiquement de modifier est kMDItemFSLabel (La couleur du fichier). J'ai eu une recherche autour et je n'arrive pas à trouver un moyen de le faire sans utiliser un module tel que Mac::Glue ou une application externe (Finder).Comment puis-je modifier les métadonnées de fichier dans OS X?

Répondre

9

L'attribut kMDItemFSLabel est une propriété du Finder. Vous devez utiliser un moyen de communiquer avec le Finder pour modifier ses données. Pour autant que je sache, il n'y a pas moyen de se tourner vers Perl pour changer les données du Finder sans passer par le Finder.

Il y a plusieurs façons de le faire:

  1. Utilisez CamelBones lorsque la nouvelle version sort. Cela permet à Perl de passer de l'Objective C à l'Objective C. Ensuite, vous devrez utiliser la méthode Apple avec les appels système Cocoa. courbe d'apprentissage pour le cacao ...

  2. Si vous avez des outils de développement, l'utilisation/Developer/Outils/SetFile (si qui prend en charge l'élément de métadonnées)

  3. Utilisez osascript pour envoyer le message au Finder pour changer la couleur du fichier. Vous pouvez regarder this plus tôt après pour des conseils sur ce faire.

La plupart des ponts Objective C/Cocoa liés à Perl sont malheureusement morts. MacPerl n'a pas été mis à jour depuis 2005.

Presque toutes les méthodes les plus simples nécessitent de connaître au moins une quantité minimale d'Applescript et d'appeler le texte de ce script par un appel de type interpolé à osascript.

Dans sa forme 1 ligne, osascript Perl fait beau regard:

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

Pour utiliser osascript de Perl, la plupart utilisent un document ICI. Il y a des exemples de livre que j'ai appelé Applescript - The Definitive Guide et de brian d foy on Controlling iTunes with Perl.

Voici un script en Perl j'ai écrit pour la mise en couleur de fichier en utilisant 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 la couleur du Finder est 0, kMDItemFSLabel est 0. En cas de jeu de couleurs, kMDItemFSLabel devient 8 couleurs. à savoir, l'étiquette "orange" est label index 1, kMDItemFSLabel = 7; l'étiquette "rouge" est label index 2, kMDItemFSLabel = 6; etc.

+0

Merci pour la réponse géniale. C'était exactement ce que je cherchais. –

+0

Vous êtes les bienvenus – dawg

1

Perl n'a pas de fonction intégrée pour fonctionner sur les métadonnées du système de fichiers Mac. Soit vous utilisez une bibliothèque du CPAN, soit vous l'écrivez vous-même, probablement pas aussi bien que l'auteur de celle du CPAN.

1

En fait, ce n'est pas si compliqué à mettre en œuvre. Vous pouvez utiliser la commande xattr comme indiqué dans la chaîne doc ci-dessous ... J'ai Enveloppez la fonction de base dans un script python qui applique des couleurs nommées à une série de fichiers ...

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