Если вы просто хотите «время последнего доступа» в терминах времени последнего доступа к ОС, mdls
- неправильный инструмент.Используйте perl's stat
.Если вам нужно время последнего доступа с точки зрения зарегистрированного приложения для Mac (например, песни от Quicktime или iTunes), тогда mdls
- потенциально правильный инструмент.(Вы также можете использовать osascript для непосредственного запроса к приложению Mac ...)
Обратные галочки предназначены для захвата возврата текста.Поскольку вы используете MDL, я предполагаю, что захват и анализ текста еще впереди.
Таким образом, есть несколько методов:
Используйте форму списка system , и цитирование не требуется (если вас не волнуеттекст возврата);
Используйте String :: ShellQuote , чтобы экранировать имя файла перед отправкой в sh;
Соберите строку и заключите в одинарные кавычки перед отправкой на отправку в оболочку.Это сложнее, чем кажется, потому что имена файлов с одинарными кавычками побеждают ваши кавычки!Например, sam's song.mp4
является допустимым именем файла, но если вы заключите в одинарные кавычки, вы получите 'sam's song.mp4'
, что совсем не то, что вы имели в виду ...
Используйте open
дляоткрыть канал для вывода дочернего процесса следующим образом: open my $fh, '-|', "mdls", "$curr_file" or die "$!";
Пример String :: 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);