Perl脚本找不到最新的文件



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

# Check that file exists (can be directory or link)
unless (-d $opt_f) {
print "FILE_AGE CRITICAL: Folder not found - $opt_fn";
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所说,您最好对文件数组进行排序,并根据您要查找的内容推送/弹出第一个/最后一个值。

最新更新