代码之家  ›  专栏  ›  技术社区  ›  cowgod

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

  •  60
  • cowgod  · 技术社区  · 15 年前

    假设我有一个文件句柄 $fh . 我可以用 -e $fh 或其文件大小 -s $fh a slew of additional information about the file . 如何获取上次修改的时间戳?

    9 回复  |  直到 5 年前
        1
  •  94
  •   gil_mo    5 年前

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

    打电话 stat($fh) 返回一个数组,其中包含有关传入的文件句柄的以下信息(从 perlfunc man page for stat ):

      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个元素将给出自epoch以来的最后一次修改时间( 1970年1月1日00:00格林威治标准时间 )从中可以确定当地时间:

    my $epoch_timestamp = (stat($fh))[9];
    my $timestamp       = localtime($epoch_timestamp);
    

    避免 幻数 9在上一个示例中需要,另外使用 Time::localtime ,另一个内置模块(也包括在Perl5.004中)。这需要一些(可以说)更清晰的代码:

    use File::stat;
    use Time::localtime;
    my $timestamp = ctime(stat($fh)->mtime);
    
        2
  •  23
  •   Michael Carman    15 年前

    使用内置 stat 功能。或者更具体地说:

    my $modtime = (stat($fh))[9]
    
        3
  •  18
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前
    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 .

        4
  •  13
  •   Paul Beckingham    15 年前

    您需要stat调用和文件名:

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

    Perl也有不同的版本:

    my $last_mod_time = -M $file;
    

    但这个值与程序启动的时间有关。这对于排序之类的事情很有用,但您可能需要第一个版本。

        5
  •  9
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    如果你只是比较两个文件,看看哪个是更新的,那么 -C 应该工作:

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

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

        6
  •  3
  •   Chris Kloberdanz    15 年前

    您可以使用stat()或文件::stat模块。

    perldoc -f stat
    
        7
  •  3
  •   Lee    15 年前

    我认为您正在寻找stat函数(perldoc-f stat)

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

    所以:

    我的$上次修改时间=(stat($fh))[9];

        8
  •  2
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    在我身上 FreeBSD 系统, 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";
    
        9
  •  1
  •   ndmeiri Someguy    6 年前

    这是一个非常旧的线程,但我尝试使用该解决方案,但无法从文件中获取信息::stat。(Perl5.10.1)

    我必须做以下工作:

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

    我只是想和大家分享一下,以防其他人也遇到同样的麻烦。