OSの最終アクセス時間に関して「最終アクセス時間」が必要な場合mdls
は、間違ったツールです。perl を使用しstat
ます。Mac に登録されたアプリケーション (つまり、Quicktime または iTunes の曲) に関して最終アクセス時刻が必要な場合mdls
は、適切なツールである可能性があります。( osascriptを使用して Mac アプリを直接クエリすることもできます...)
バックティックは、テキスト リターンをキャプチャするためのものです。mdls を使用しているため、テキストのキャプチャと解析はまだこれからだと思います。
したがって、いくつかの方法があります。
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);