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
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:
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 ...
Se si dispone di strumenti di sviluppo, uso/Developer/Tools/SetFile (se questo supporta l'elemento di metadati)
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.
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.
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))
Grazie per il risposta fantastica Questo era esattamente quello che stavo cercando. –
Prego – dawg