如何解决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 举报,一经查实,本站将立刻删除。