我找到了下面的一类代码,可以创建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模块。
答案 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;
其中$mday
从1
出发,而所有其他位置都从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
的问题。另请参阅问题和聊天下方的评论。