簡體   English   中英

Perl 腳本未找到最新文件

[英]Perl Script did not find the newest file

我使用來自“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;

示例:我在文件管理器上有一些文件(a.img 文件中的備份)。 我使用這個腳本來檢查最新的文件大小。 如果我使用新文件創建一個新文件夾,則檢查會查找正確的文件。 但是如果我創建第二個文件,檢查會隨時查看舊文件。 如果我創建第三個文件,檢查將轉到正確的文件。 第四個文件錯了,第五個文件又對了(以此類推)

一個簡單(更簡單?)的方法是使用內置的glob function 來讀取目錄而不是打開它,然后使用簡單的文件測試按創建或修改時間對文件進行排序:

   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 行預計 output 是 File::stat::stat() 的。 我懷疑測試“。” 或 '..' 應該在 while 循環的頂部完成,並且所有變量都應該在使用之前定義。

正如傑里米所說,您最好對文件數組進行排序並推送/彈出第一個/最后一個值,具體取決於您要查找的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM