it-swarm.dev

如何在Perl中获取文件的上次修改时间?

假设我有一个文件句柄$fh。我可以使用-e $fh或其文件大小检查其存在与-s $fh有关该文件的大量其他信息 。如何获得最后修改的时间戳?

60
cowgod

您可以使用内置模块File::stat(自Perl 5.004起包含)。

调用stat($fh)会返回一个数组,其中包含有关传入的文件句柄的以下信息(来自statperlfunc手册页 ):

  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日00:00)。从那里你可以确定当地时间:

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

使用builtin stat 函数。或者更具体地说:

my $modtime = (stat($fh))[9]
23
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。

更多信息在stat

18
user13673

您需要stat调用和文件名:

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

Perl也有不同的版本:

my $last_mod_time = -M $file;

但该值与程序启动时相关。这对排序等问题很有用,但您可能需要第一个版本。

13
Paul Beckingham

如果您只是比较两个文件以查看哪个更新,那么-C应该有效:

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

还有-M,但我认为这不是你想要的。幸运的是,通过Google搜索这些文件操作符的文档几乎是不可能的。

9
Dan Olson

您可以使用stat()或File :: Stat模块。

perldoc -f stat
3
Chris Kloberdanz

我想你正在寻找stat函数(perldoc -f stat

特别是,返回列表的第9个字段(第10个,索引#9)是自Epoch以来以秒为单位的文件的最后修改时间。

所以:

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

3
Lee

在我的 FreeBSD system上,stat只返回一个祝福。

$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