【问题标题】:How to get file creation time in Unix with Perl如何使用 Perl 在 Unix 中获取文件创建时间
【发布时间】:2014-10-12 15:11:41
【问题描述】:

如何使用 perl 在 unix 中获取文件创建时间?

我有这个显示文件最后修改时间的命令:

perl -MPOSIX -le 'print strftime "%d %b %Y %H:%M ".$_, localtime((lstat)[9]) for @ARGV' file.txt

【问题讨论】:

标签: perl shell unix unix-timestamp


【解决方案1】:

在 UNIX 中通常没有文件创建时间。一个新的xstat() 接口承诺支持它,但perl 不使用它。可以编写一个基于 XS 的接口来访问它。

在 UNIX 上的 Perl 中,ctime 代表 Inode Change Time,它与文件创建无关。

根据perlportctime 将是仅在 Windows 上的创建时间,但您可能希望使用 Win32API::File::Time::GetFileTime(),因为它更明确(并且对搬运工来说很明显)您的程序依赖于 创建时间 而不是 ctime 包含的任何内容。

【讨论】:

    【解决方案2】:

    你几乎拥有它。

    您只需将localtime 的返回值而不是文件名传递给strftime

    perl -MPOSIX -e 'printf "%s %s\n", $_, strftime("%d %b %Y %H:%M", localtime((lstat)[9])) for @ARGV' file.txt
    

    输出:

    file.txt 10 Oct 2014 15:38
    

    即使需要更多代码,我还是倾向于使用 Time::PieceFile::stat 以使代码更现代和可读:

    perl -MTime::Piece -MFile::stat -e '
        printf "%s %s\n",  $_, localtime( stat($_)->mtime )->strftime("%d %b %Y %H:%M") for @ARGV
      ' file.txt
    

    【讨论】:

    • 它仍然没有给我创建时间:-(
    • 查看stat 的文档。也许您想要ctime 而不是mtime?请务必阅读 (*) 并非所有文件系统类型都支持所有字段。值得注意的是,ctime 字段是不可移植的。特别是,你不能指望它是一个“创造时间”;有关详细信息,请参阅 perlport 中的文件和文件系统。
    • 查看 stat 的文档; ctime 不代表“文件创建时间”。
    • 我知道。看看我之前的评论。
    • ctime 代表“创造”是一种常见的误解。 ctime 是 inode 的最后更改时间(权限、所有权、名称),而 mtime 表示文件/目录内容的最后修改时间。最普遍的是,即使使用perl -i 进行原位更新,其修改时间也反映了创建实例。
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多