создавать текстовые файлы с mtime между временным диапазоном - PullRequest
1 голос
/ 22 марта 2019

Я нашел ниже одну строку, которая создает 50 текстовых файлов

perl -MPath::Tiny -wE'
    path("dir/s".$_.".txt")->spew("some data...$_\n") for 1..50

, но создает все файлы с mtime в качестве текущего времени.

Возможно ли иметь mtimeмежду датой?как с января 2016 года по декабрь 2018 года для текстовых файлов?.

Я понимаю, что должен использовать модуль Time :: Piece, но я не вижу модуль Time :: Piece в моем Perl RHEL, который равен 5.010.

1 Ответ

2 голосов
/ 22 марта 2019

В 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 описана в этот пост в блоге Дэйва Кросса .Также смотрите комментарии под вопросом и чат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...