在时间范围之间使用mtime创建文本文件

时间:2019-03-22 11:02:51

标签: perl

我找到了下面的一类代码,可以创建50个文本文件

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

但是它将创建所有文件,其中mtime为当前时间。

是否可以在日期范围之间设置mtime?例如文本文件的2016年1月至2018年12月?。

我了解我必须使用Time :: Piece模块,但在RHEL Perl 5.010中看不到Time :: Piece模块。

1 个答案:

答案 0 :(得分:2)

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

由于path(..)->spew(..)->touch(..)返回true / false而不是对象,因此无法对所需的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;

其中$mday1出发,而所有其他位置都从0开始。请注意,虽然传统上提供受+1900约束的年份(2016年为116),但也可以接受正常年份。所以

$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)

this post in Dave Cross's blog中描述了缺少Time::Piece的问题。另请参阅问题和聊天下方的评论。