web-dev-qa-db-ja.com

Perlでファイルの最終変更時刻を取得するにはどうすればよいですか?

ファイルハンドル$fhがあるとします。 -e $fhでその存在を確認するか、-s $fhまたは ファイルに関する追加情報 でそのファイルサイズを確認できます。最後に変更されたタイムスタンプを取得するにはどうすればよいですか?

62
cowgod

組み込みモジュール_File::stat_(Perl 5.004に含まれています)を使用できます。

stat($fh)を呼び出すと、渡されたファイルハンドルに関する次の情報を含む配列が返されます( stat のperlfunc manページから):

_  0 dev      device number of filesystem
  1 ino      inode number
  2 mode     file mode  (type and permissions)
  3 nlink    number of (hard) links to the file
  4 uid      numeric user ID of file's owner
  5 gid      numeric group ID of file's owner
  6 rdev     the device identifier (special files only)
  7 size     total size of file, in bytes
  8 atime    last access time since the Epoch
  9 mtime    last modify time since the Epoch
 10 ctime    inode change time (NOT creation time!) since the Epoch
 11 blksize  preferred block size for file system I/O
 12 blocks   actual number of blocks allocated
_

この配列の要素番号9は、エポック以降の最終変更時刻を示します([1970年1月1日GMT)。それから現地時間を決定できます:

_my $Epoch_timestamp = (stat($fh))[9];
my $timestamp       = localtime($Epoch_timestamp);
_

前の例で必要だったマジック番号9を避けるには、別の組み込みモジュール_Time::localtime_を追加で使用します(Perl 5.004以降も含まれます) )。これには、いくつかの(おそらく)より読みやすいコードが必要です。

_use File::stat;
use Time::localtime;
my $timestamp = ctime(stat($fh)->mtime);
_
96
cowgod

組み込みの stat 関数を使用します。または、より具体的に:

my $modtime = (stat($fh))[9]
24
Michael Carman
my @array = stat($filehandle);

変更時刻は、Unix形式で$ array [9]に保存されます。

または明示的に:

my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size,
    $atime, $mtime, $ctime, $blksize, $blocks) = stat($filepath);

  0 dev      Device number of filesystem
  1 ino      inode number
  2 mode     File mode  (type and permissions)
  3 nlink    Number of (hard) links to the file
  4 uid      Numeric user ID of file's owner
  5 gid      Numeric group ID of file's owner
  6 rdev     The device identifier (special files only)
  7 size     Total size of file, in bytes
  8 atime    Last access time in seconds since the Epoch
  9 mtime    Last modify time in seconds since the Epoch
 10 ctime    inode change time in seconds since the Epoch
 11 blksize  Preferred block size for file system I/O
 12 blocks   Actual number of blocks allocated

エポックは1970年1月1日00:00 GMTでした。

詳細はstatにあります。

18
David Segonds

Stat呼び出しとファイル名が必要です:

my $last_mod_time = (stat ($file))[9];

Perlには異なるバージョンもあります。

my $last_mod_time = -M $file;

ただし、その値はプログラムが開始されたときからの相対値です。これは並べ替えなどに役立ちますが、おそらく最初のバージョンが必要です。

13
Paul Beckingham

2つのファイルを比較してどちらが新しいかを確認する場合は、-Cが機能するはずです。

if (-C "file1.txt" > -C "file2.txt") {
{
    /* Update */
}

-Mもありますが、あなたが望むものだとは思いません。幸いなことに、これらのファイル演算子に関するドキュメントをGoogle経由で検索することはほとんど不可能です。

9
Dan Olson

Stat()またはFile :: Statモジュールを使用できます。

perldoc -f stat
3

stat関数(_perldoc -f stat_)を探していると思います

特に、返されるリストの9番目のフィールド(10番目、インデックス#9)は、エポック以降のファイルの最終変更時間(秒単位)です。

そう:

my $last_modified = (stat($fh))[9];

3
Lee

私の FreeBSD システムでは、statは単にblessを返します。

$VAR1 = bless( [
                 102,
                 8,
                 33188,
                 1,
                 0,
                 0,
                 661,
                 276,
                 1372816636,
                 1372755222,
                 1372755233,
                 32768,
                 8
               ], 'File::stat' );

次のようにmtimeを抽出する必要があります。

my @ABC = (stat($my_file));

print "-----------$ABC['File::stat'][9] ------------------------\n";

または

print "-----------$ABC[0][9] ------------------------\n";
2
holly

これは非常に古いスレッドですが、このソリューションを使用しようとしましたが、File :: statから情報を取得できませんでした。 (Perl 5.10.1)

私は次のことをしなければなりませんでした:

my $f_stats = stat($fh);
my $timestamp_mod = localtime($f_stats->mtime);
print "MOD_TIME = $timestamp_mod \n";

他の誰かが同じトラブルを抱えていた場合に備えて、私は共有したいと思った。

1
MBW