如果您只是想要就操作系统上次访问时间而言的“上次访问时间”,那mdls
是错误的工具。使用 perl 的stat
. 如果您想根据 Mac 注册应用程序(即 Quicktime 或 iTunes 的歌曲)的最后访问时间,那么mdls
它可能是正确的工具。(您也可以使用osascript直接查询 Mac 应用程序...)
反引号用于捕获文本返回。由于您使用的是 mdls,因此我假设捕获和解析文本仍将到来。
所以有几种方法:
使用系统的列表形式,不需要引用(如果你不关心返回文本);
在发送到 sh 之前使用String::ShellQuote转义文件名;
在发送到发送到 shell 之前,构建字符串并用单引号括起来。这比听起来更难,因为带有单引号的文件名会破坏您的引号!例如,sam's song.mp4
是一个合法的文件名,但如果你用单引号括起来你会得到'sam's song.mp4'
这不是你的意思......
用于open
打开通往子进程输出的管道,如下所示:open my $fh, '-|', "mdls", "$curr_file" or die "$!";
字符串::ShellQuote 示例:
use strict; use warnings;
use String::ShellQuote;
use File::Find;
my $top_dir = '/Users/andrew/music/iTunes/iTunes Music/Music';
sub wanted {
if ($File::Find::name) {
my $curr_file = "$File::Find::name";
my $rtr;
return if -d;
my $exec="mdls ".shell_quote($curr_file);
$rtr=`$exec`;
print "$rtr\n\n";
}
}
find(\&wanted, $top_dir);
管道示例:
use strict; use warnings;
use String::ShellQuote;
use File::Find;
my $top_dir = '/Users/andrew/music/iTunes/iTunes Music/Music';
sub wanted {
if ($File::Find::name) {
my $curr_file = "$File::Find::name";
my $rtr;
return if -d;
open my $fh, '-|', "mdls", "$curr_file" or die "$!";
{ local $/; $rtr=<$fh>; }
close $fh or die "$!";
print "$rtr\n\n";
}
}
find(\&wanted, $top_dir);