如何在perl中找到几分钟的旧文件

时间:2015-06-22 08:22:23

标签: regex perl unix

我只想处理10分钟前修改过的文件。我试图像这样实现它。

for my $file (<${dir}/*csv>_) { 
    if ( -M $file < .0069 ) {
        next;
        }
    else {
         code ...
          }
    } 
<00> .0069天计算10分钟(10 /(24 * 60))。现在,目录中存在的超过1天的文件被正确识别,但任何小于1天的文件都被错误识别。例如,如果文件早于23小时,则会在if块中处理,而不是以其他方式处理。 我猜'-M $ file'将其值转换为整数(在这种情况下为0)。有人可以帮忙吗?谢谢

其他: 谢谢大家。我现在正在尝试使用file :: Stat

for my $file (<${dir}/*csv>_) { 
    my $mtime = (stat($file))[9];
    my ctime = time;
    my $time_diff = $ctime - $mtime;

    if ( $time_diff < 600 ) {
        next; }
    else {
        code ...
          }
    }

但这并不会带来准确的结果。对于刚刚创建的文件,$ time_diff必须几乎为零,但它出现在-17640左右。我猜时代不应该是任何问题,因为两个时间都是从纪元开始计算的。哪里错了? (服务器时间跟随IST(+5:30小时)

} 

3 个答案:

答案 0 :(得分:1)

编写的代码应该有效。有几个可能的原因,为什么它没有。一个当然是熟悉的旧浮点不准确,但这应该只接近十分钟限制的时间。另一个,我认为更有可能,但你没有提供足够的上下文来确定,是-M运算符返回文件时间戳和脚本开始运行的时间之间的差异。这意味着,例如,在脚本启动后创建的任何文件都将从-M获得负值。如果您的脚本长时间运行,-M就没用了。如果您的文件所在的文件系统是远程文件系统(NFS或其他),则托管文件系统的服务器与运行脚本的服务器之间的时钟差异也会使事情变得混乱。

我建议您重写代码以直接使用stat()。这样你就可以在几秒钟内获得时间,因此你可以处理整数而不是浮点数,并且可以与当前时间而不是脚本开始时间进行比较。请查看perldoc File::stat以使stat()更具可读性。

答案 1 :(得分:0)

您的代码确实有效: 尝试

for my $file (<*>) { 
  print "File $file\n\t -M: " . (-M $file );
  if ( -M $file < .0069 ) {
     print " Doesnt fit\n";
     next;
  } else {
      print " Fits\n";
  }
} 

在我的/ tmp目录中返回:

File config-err-GBOOnR
     -M: 0.0935532407407407 Fits
File cvcd
     -M: 0.0938425925925926 Fits
File kde-gm
     -M: 0.0935300925925926 Fits
File ksocket-gm
     -M: 0.0935300925925926 Fits
File orbit-gm
     -M: 16608.367650463 Fits
File unity_support_test.0
     -M: 0.0935532407407407 Fits

但您也可以使用stat代替:

my $mtime = stat($file)[9];
if(time-$mtime > 10*60) {
}

应该做的工作。见

perldoc -f stat

答案 2 :(得分:0)

包含perl的大多数Linux安装可能都有更通用的find2perl程序。