微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Perl 脚本没有找到最新的文件

如何解决Perl 脚本没有找到最新的文件

我使用以下来自“https://exchange.nagios.org/directory/Plugins/Operating-Systems/Linux/Check-Newest-files-age-and-size-in-Diredtory/”的 perl 脚本 但在这些脚本中是一个错误。该脚本未显示最新文件。有人能找出错误吗?在该站点评论中有人写道,第 22 行的错误是。我找不到它: 代码如下:

# Check that file exists (can be directory or link)
unless (-d $opt_f) {
        print "FILE_AGE CRITICAL: Folder not found - $opt_f\n";
        exit $ERRORS{'CRITICAL'};
}

my $list = opendir DIRHANDLE,$opt_f or die "Cant open directory: $!";

while ($_ = readdir(DIRHANDLE))
{
    $file=sprintf("%s/%s",$opt_f,$_);
    $attrs = stat("$file");
    $diff = time()-$attrs->mtime;
    if($temp == 0)
    {
        #$temp=$diff;
        $new=$file;
    }
    if($_ ne "." && $_ ne "..")
    {
        if($diff<$temp)
        {
            $temp=$diff;
            $new=$_;
        }
        else
        {
            $temp=$diff; $new=$_;
        }
    }
}

$st = File::stat::stat($opt_f."/".$new);
$age = time - $st->mtime;
$size = $st->size;

示例: 我在文件管理器上有一些文件(.img 文件中的备份)。我使用这个脚本来检查最新的文件大小。如果我用一个文件创建一个文件夹,检查会查找正确的文件。但是,如果我创建第二个文件,则检查会随时查看旧文件。如果我创建第三个文件,检查会转到正确的文件。第四个文件错了,第五个文件又正确了(以此类推)

解决方法

一个简单(更容易?)的方法是使用内置的 glob 函数读取目录而不是打开它,然后使用简单的文件测试通过创建或修改对文件进行排序时间:

   my @files = sort {-M($a) <=> -M($b)} glob "*"; # or -C for creation
   # $files[0] is the newest file

文件测试操作符列表位于 https://users.cs.cf.ac.uk/Dave.Marshall/PERL/node69.html

请注意,-C-M 与脚本的启动时间有关,因此对于长时间运行或守护进程的脚本,您可能需要做一些不同的事情。 >

,

您想找到最早的 mtime,所以我们讨论的是将先前找到的较早 mtime 与当前文件的 mtime 进行简单比较。但是在您发布的内容之外还有很多代码……您对要比较的值所做的第一件事就是更改它?什么?

让我们重新开始。

my $earliest_mtime = -1;
my $earliest_qfn;
while (defined( my $fn = readdir($dh) )) {
   next if $fn =~ /^\.\.?\z/;

   my $qfn = "$dir_qfn/$fn";
   my $stats = stat($qfn)
      or warn("Can't stat \"$qfn\": $!\n"),next;

   my $mtime = $stats->mtime;
   if ($mtime < $earliest_mtime) {
      $earliest_mtime = $mtime;
      $earliest_qfn = $qfn;
   }
}

if (defined($earliest_qfn)) {
   say $earliest_qfn;
}
,

脚本的最大问题似乎是第 12 行调用了 stat 的核心版本,但第 13 行期望输出是 File::stat::stat() 的输出。我怀疑测试 '.'或 '..' 应该在 while 循环的顶部完成,并且所有变量都应该在使用之前定义。

正如 Jeremy 所说,您最好对文件数组进行排序并推送/弹出第一个/最后一个值,具体取决于您要查找的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。