How can I get the high-res mtime for a symbolic link?
perl, stat, symlink
Solution
If you are willing to use Inline::C, this will work with recent 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]);
Problem
I want to reproduce the output of `ls --full-time` from a Perl script to avoid the overhead of calling `ls` several thousand times. I was hoping to use the stat function and grab all the information from there. However, the timestamp in the ls output uses the high-resolution clock so it includes the number of nanoseconds as well (according to the GNU docs, this is because `--full-time` is equivalent to `--format=long --time-style=full-iso`, and the full-iso time style includes the nanoseconds). I came across the Time::HiRes module, which overrides the standard stat function with one that returns atime/mtime/ctime as floating point numbers, but there's no override for lstat. This is a problem, because calling stat on a symlink returns info for the linked file, not for the link itself. So my question is this - where can I find a version of lstat that returns atime/mtime/ctime in the same way as Time::HiRes::stat? Failing that, is there another way to get the modtime for a symlink in high resolution (other than calling ls).