有没有人知道是否可以在OS X上直接编辑文件元数据。特别是在perl中。我特意尝试更改的参数是kMDItemFSLabel
(文件的颜色)。我已经进行了搜索,如果不使用Mac::Glue或外部应用程序(Finder)等模块,我似乎无法找到方法。
答案 0 :(得分:10)
kMDItemFSLabel
属性是Finder的属性。您需要使用与Finder通信的方式来更改其数据。据我所知,你无法通过Perl来改变Finder的数据,而无需通过Finder。
有几种方法可以做到这一点:
新版本发布时使用CamelBones。这允许从Perl桥接到Objective C.然后,您将需要在Cocoa系统调用中使用Apple方法。 Cocoa的陡峭学习曲线......
如果您有开发人员工具,请使用/ Developer / Tools / SetFile(如果支持元数据项)
使用osascript将消息发送到Finder以更改文件的颜色。您可以查看this之前的SO帖子,了解相关提示。
不幸的是,大多数与Perl相关的Objective C / Cocoa桥已经死亡。 MacPerl自2005年以来一直没有更新。
几乎所有最简单的方法都需要知道至少最少量的Applescript并通过对osascript的内插类型调用来调用该脚本的文本。
在其1行形式中,osascript使Perl看起来很漂亮:
osascript -e 'tell application "Finder"' -e "activate" -e "display dialog \"hello\"" -e 'end tell'
要使用Perl的osascript,大多数都使用HERE文档。我在书中提到了Applescript - The Definitive Guide和brian d foy on Controlling iTunes with Perl。
这是我用Perl编写的用于设置文件颜色的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);
如果Finder颜色为0,则kMDItemFSLabel
为0.如果有任何颜色设置,kMDItemFSLabel
将变为8色。即,标签“orange”是label index
1,kMDItemFSLabel
= 7;标签“red”是label index
2,kMDItemFSLabel
= 6;等等。
答案 1 :(得分:1)
Perl中没有内置函数可以在Mac文件系统元数据上运行。您可以使用CPAN中的库,也可以自己编写,可能不如CPAN的作者那样。
答案 2 :(得分:1)
实施起来并不复杂。您可以使用xattr
命令,如下面的doc字符串所示...
我已经将基本函数包装在python脚本中,该脚本将命名颜色应用于一系列文件......
#!/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))
答案 3 :(得分:0)