Walrus,Digit. | 一覧 | 検索 | 更新履歴(RSS) | 新規作成
はてなブックマークに追加 はてなブックマークを表示 編集 | 編集(管理者用) | 差分

Perlメモ/ファイルの更新時刻

編集

ファイルのアクセス時刻、更新時刻の取得と設定(変更)。

主として、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モジュールの使用

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);

コメント

[[#rcomment]]