ファイルのアクセス時刻、更新時刻の取得と設定(変更)。
主として、statおよびutime関数についての解説になります。 公式のドキュメントでは、perlfuncの各項をご覧ください。 日本語で読みたいときには、perldoc.jpにいくつかの版の日本語訳があります。
ファイルの最終更新時刻、最終アクセス時刻は、stat関数で取得できます。 stat関数は引数で渡されたファイル情報の配列を返します。 その9番目(インデックスは8)が最終アクセス時刻、10番目(インデックスは9)が最終更新時刻です。
my @stats = stat('./test.txt');
print "最終アクセス時刻 : " . $stats[8] . "\n";
print "最終更新時刻 : " . $stats[9] . "\n";
この値は1970年1月1日からの秒数なので、出力時にはlocaltime関数を使って読みやすい形にした方が良いでしょう。
my @stats = stat('./test.txt');
my $mtime = $stats[8];
my ($sec, $min, $hour, $day, $month, $year) = localtime($mtime);
printf("最終更新日時は'%04d/%02d/%02d %02d:%02d:%02d'です。\n", $year + 1900, $month + 1, $day, $hour, $min, $sec);
File::statモジュールを使うと、stat関数はFile::statオブジェクトを返すようになります。こうすると、メソッドで更新時刻などを取得できるようになります。
use File::stat;
my $stat = stat('./test.txt');
print "最終アクセス時刻 : " . $stats->atime . "\n";
print "最終更新時刻 : " . $stats->mtime . "\n";
atimeはAccess Time、mtimeはModify Timeの略でしょうか。インデックスよりはこれらのメソッド名のほうが覚えやすいでしょう。
ファイルの最終更新時刻、最終アクセス時刻は、utime関数で設定できます。 utimeは、次の書式で使用します。
$_ = utime($atime, $mtime, @files);
$atimeは設定するアクセス時刻、$mtimeは更新時刻、@filesはこのアクセス日、更新日にするファイル群です。 $_に入る返り値は、アクセス日と更新日のセットに成功したファイル数です。
perlfuncには、touchコマンドの例が載っています。
#!/usr/bin/perl $now = time; utime $now, $now, @ARGV;
ファイルのコピー後に、アクセス時刻、更新時刻を元のファイルに合わせます。 ファイルのコピーにFile::Copy、時刻取得にFile::statモジュールを使っていますが、モジュールを使わない(open、sysread、syswrite、close関数でコピーし、stat関数で時刻取得)場合でも考え方は同じです。
use File::Copy; use File::stat; my $org_file = "./test.pl"; my $new_file = "./test3.pl"; my $stat = stat($org_file); my $atime = $stat->atime; my $mtime = $stat->mtime; copy($org_file, $new_file) or die "Copy failed: $!"; utime($atime, $mtime, $new_file);