Я хочу воспроизвести вывод ls --full-time
из сценария Perl для предотвращения издержек вызова ls
несколько тысяч раз. Я надеялся использовать статистику, функционируют и захватывают всю информацию оттуда. Однако метка времени в ls произвела, использует часы с высоким разрешением, таким образом, это включает число наносекунд также (согласно документам GNU, это вызвано тем, что - полный рабочий день эквивалентен --format=long --time-style=full-iso
, и стиль времени полной ISO включает наносекунды).
Я столкнулся со Временем:: модуль HiRes, который переопределяет стандартную функцию статистики с той, которая возвращает atime/mtime/ctime как числа с плавающей точкой, но нет никакого переопределения для lstat. Это - проблема, потому что вызов статистики на символьной ссылке возвращает информацию для связанного файла, не для самой ссылки.
Таким образом, мой вопрос - это - где может я находить версию lstat, который возвращает atime/mtime/ctime таким же образом как Время:: HiRes:: статистика? Сбой этого, там другой способ получить modtime для символьной ссылки в высоком разрешении (кроме вызова ls).
Лучше всего попросить добавить lstat
в Time :: HiRes . На самом деле, вы, вероятно, могли бы сделать это сами. Готов поспорить, что все, что вам нужно сделать, это скопировать функцию, которая запускает
void
stat(...)
в HiRes.xs
, изменить stat (...)
на lstat (. ..)
& OP_STAT
в OP_LSTAT
, добавьте lstat
в @EXPORT_OK
в HiRes.pm
, и перекомпилируйте. Затем отправьте патч, чтобы другие могли получить от него пользу.
Если вы хотите использовать 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]);