В Path :: Tiny есть метод touch
, а остальное - это разбиение желаемого диапазона дат.Обратите внимание, что приведенный ниже скрипт создает файлы (по умолчанию 10) с очень простыми именами, поэтому, пожалуйста, запускайте в совершенно новом каталоге, чтобы не перезаписывать что-либо
perl -MPath::Tiny -MTime::Piece -wE'
$n = shift // 10;
($beg, $end) = map {
Time::Piece->strptime($_, "%Y%m%d")->epoch
} (20160101, 20181201);
$step = int ($end-$beg)/$n;
for (1..$n) {
$f = path("s$_.txt");
$f->spew("data..$_\n");
$f->touch($beg += $s)
' 5
.не работает, так как spew
возвращает истину / ложь, а не объект.(touch
действительно возвращает объект, и поэтому к нему могут быть привязаны методы, но здесь он должен идти после spew
, поскольку spew
изменяет время модификации.)
Выше созданы файлы
-rw-rw-r--. 1 xxx 8 Jul 31 2016 s1.txt
-rw-rw-r--. 1 xxx 8 Mar 1 2017 s2.txt
-rw-rw-r--. 1 xxx 8 Sep 30 2017 s3.txt
-rw-rw-r--. 1 xxx 8 May 1 2018 s4.txt
-rw-rw-r--. 1 xxx 8 Nov 30 2018 s5.txt
Возможно, вы захотите поиграть с размером шага и отметками первого / последнего времени.
Очевидно, что есть проблема с Time::Piece
, что, вероятно, указывает на проблему сэта система † , поскольку модуль находится в ядре с 5.9.5.Тогда я бы использовал Time::Local::timelocal
use Time::Local;
my $seconds_epoch = timelocal $sec, $min, $hour, $mday, $mon, $year;
, где $mday
идет от 1
, тогда как все остальные начинаются с 0
.Обратите внимание, что, хотя традиционно указывается год с +1900
(то есть 116
для 2016 года), нормальные годы также принимаются.Так
$beg = timelocal 0, 0, 0, 1, 0, 2016;
$end = timelocal 0, 0, 0, 31, 11, 2018;
или, для большей гибкости с датами
($beg, $end) = map {
($yr, $m, $d) = unpack "A4A2A2";
timelocal 0, 0, 0, $d, $m-1, $yr
} (20160101, 20181231)
† Проблема пропущенного Time::Piece
описана в этот пост в блоге Дэйва Кросса .Также смотрите комментарии под вопросом и чат.