我想以与 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 上(在
bash
和 tcsh
下)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/