【问题标题】:How can I compare file creation time to the current time in Perl?如何将文件创建时间与 Perl 中的当前时间进行比较?
【发布时间】:2010-09-28 16:33:52
【问题描述】:

我想比较 Perl 中的当前时间和文件创建时间,但两者的格式不同。 localtime 的格式如下:

22116291110813630

文件创建时间为

Today, December 29, 2008, 2:38:37 PM

我如何比较哪个更大以及它们的区别?

【问题讨论】:

  • 如何转换日期的信息:perl.com/pub/a/2003/03/13/datetime.html
  • 您的问题的答案是:将它们转换为相同的格式。我建议将“今天,2008 年 12 月 29 日”转换为时间戳(自纪元以来的(毫秒)秒数)。然后就是两个数字的简单比较
  • 您是指许多文件系统不跟踪的“创建时间”,还是说“ctime”,即类 Unix 操作系统上的“inode 更改时间”?跨度>

标签: perl file time


【解决方案1】:

localtime 返回列表上下文中的值列表。请参阅the localtime documentationperlcheat。在您的示例中,看起来所有这些都混合在一起。在标量上下文中,它返回像Mon Dec 29 03:16:33 2008 这样的格式化字符串。在大多数平台上,文件 inode 更改时间将从 stat 返回,作为自某个时期以来的秒数。您应该可以直接将其与 time() 的结果进行比较(不是 localtime())。

【讨论】:

    【解决方案2】:

    如果要比较值,您可能希望在标量上下文中使用从 localtime 获得的数字以及从 stat 获得的 inode 更改时间:

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

    地点:

    0 文件系统的开发设备号 1 ino inode 编号 2模式文件模式(类型和权限) 3 nlink 文件的(硬)链接数 4 uid 数字 文件所有者的用户 ID 5 gid 文件所有者的数字组 ID 6 rdev 设备标识符(仅限特殊文件) 7 size 文件的总大小,以字节为单位 8 atime 自纪元以来的最后一次访问时间(以秒为单位) 9 mtime 自纪元以来的最后修改时间(以秒为单位) 10 ctime 自纪元以来的 inode 更改时间(以秒为单位) (*) 11 blksize 文件系统 I/O 的首选块大小 12 块 实际分配的块数

    所以你想要字段 9:

    $mtime = ( stat $filename )[9]; $current_time = time; $diff = $current_time - $mtime;

    【讨论】:

    • 感谢您向我提供信息。我认为这是在没有秒数的情况下提供差异。无论如何感谢您的指导。提前祝新年快乐
    【解决方案3】:

    这甚至比使用 stat() 和 time()/localtime() 更容易。

    my $diff = -M $filename;
    

    -M 操作符返回文件的“年龄”(程序启动后的天数)。它记录在-X functionsperldoc -f -X 下。

    【讨论】:

    • 我知道这是一个旧线程,但我还是发布了回复。 -M 给出最后修改的“年龄”而不是文件创建。 -C 会按照要求给出正确的值,但我只在单行中使用 -X 函数 (perldoc.perl.org/functions/-X.html),其余时间使用 stat。
    【解决方案4】:

    这两个功能要感谢jimtut的回答。 fileage 将文件从创建时开始的秒数打印为整数,非常适合在 shell 中使用。 fileage 是上述问题的答案,而 dataage 打印的文件内容与我一直在寻找的答案相同,我相信这些都会有用。

    function fileage {
      perl -e 'printf "%i\n", 60 * 60 * 24 * -C "'"${1:?Must provide a file name}"'"'
    }
    
    function dataage {
      perl -e 'printf "%i\n", 60 * 60 * 24 * -M "'"${1:?Must provide a file name}"'"'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      相关资源
      最近更新 更多