我想从Perl脚本重现ls –full-time的输出,以避免调用ls几千次的开销.我希望使用
stat功能并从那里获取所有信息.但是,ls输出中的时间戳使用高分辨率时钟,因此它也包含纳秒数(根据GNU文档,这是因为–full-time相当于–format = long –time- style = full-iso,full-iso时间样式包括纳秒.
我遇到了Time::HiRes模块,它覆盖了标准的stat函数,其中一个返回atime / mtime / ctime作为浮点数,但没有覆盖lstat.这是一个问题,因为在符号链接上调用stat会返回链接的信息文件,而不是链接本身.
所以我的问题是 – 在哪里可以找到一个版本的lstat以与Time :: HiRes :: stat相同的方式返回atime / mtime / ctime?如果失败了,是否有另一种方法可以获得高分辨率的符号链接的modtime(除了调用ls).
解决方法
如果您愿意使用Inline :: C,这将适用于最近的Linux
#!/usr/bin/perl use strict; use warnings; use Inline C => <<'EOC'; #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> long mtime_nsec(char* fname) { struct stat st; if (-1 == lstat(fname,&st)) return -1; return (long)st.st_mtim.tv_nsec; } EOC print mtime_nsec($ARGV[0]);