perl - 如何以 diff 命令返回的格式获取 perl 中文件的最后修改时间?

标签 perl diff stat strftime

我想以与 linux diff 显示的格式相同的格式显示时间命令。

D:\>diff -dub old.cfg new.cfg
--- old.cfg       2019-05-15 15:03:14.289950700 +0530
+++ new.cfg       2019-05-14 16:07:21.119695300 +0530

我想将文件的最后修改时间显示为 2019-05-15 15:03:14.289950700 +0530 .
我用了stat但我没有得到纳秒部分。 Alo,需要给定格式的时区。我试过Time::HiRes也有,但是拿不到。
my $dt = strftime("%Y-%m-%d %H:%M:%S", localtime((stat($old_file))[9]));

它返回:2019-05-15 15:03:14 .你能帮我附加其他信息吗?

最佳答案

我必须首先说,这不会是准确的。即使您的硬件在返回到软件时可能支持纳秒级分辨率,但它也有数百倍的延迟。 (对于一个文件的时间戳,可能仅用于相对于其他文件,这可能不太重要。)

话虽如此,我发现声称纳秒的唯一方法是使用系统的工具,所以stat

my ($ts) = grep { /^\s*Access: [0-9]{4}/ } qx(stat $file);
$ts =~ s/^\s*Access:\s+//;

或者,使用 map也可以作为过滤器
my ($ts) = map { /^\s*Access:\s+([0-9]{4}.*)/ ? $1 : () } qx(stat $file);

当然,这里的一个问题是我们必须解析输出。所以请查看您的手册页并测试您的 stat ,并且不希望有太多的可移植性。注意系统变化,因为程序的输出格式可能会发生变化。但我没有在 Perl 中找到纳秒声明。

作为引用,在我的 CentOS 7 上(在 bashtcsh 下)
perl -we'$f=shift; print grep { /^\s*Access: [0-9]{4}/ } qx(stat $f)' file

打印,用于随机文件
Access: 2019-05-15 13:21:57.723987422 -0700

Once again, the "nano"seconds aren't accurate at all.


Another option, for perhaps more reliable output parsing, is to use ls with its --full-time

my $ts = join ' ', (split ' ', qx(ls --full-time $file))[5..7];

与往常一样,在运行外部命令时,请谨慎构建变量,并适本地引用和转义。一个好工具是String::ShellQuote .或者,除非特别需要,否则最好完全避免使用 shell。最好使用运行外部工具的模块来完成所有这些工作。

关于perl - 如何以 diff 命令返回的格式获取 perl 中文件的最后修改时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56162311/

相关文章:

perl - 为什么我用 Perl 获取的 HTML 看起来与我在浏览器中看到的不同?

java - 有 OpenGrok API 吗?

git - 如何让 git log 显示相对于当前目录的文件路径?

diff - 寻找基于 Web 的差异组件

linux - Perl:从 star 命令获取用户名和组名

c - 仅列出常规文件(无目录)问题

c - 如何在 C 代码中构建 Perl 哈希?

Perl LibXML 来自textContent 的原始数据?

diff - 在 Perforce GUI 工具中使用 windiff

android - 在 Android 上使用 Runtime.getRuntime().exec() 执行 "stat"时出现 IOException?