Perl

從目錄中檢索最新數據

  • June 25, 2021

我想從此data.list目錄中檢索行數:Project/chris/company/Delta/force/run_20210619_df/total/data.list但問題是run_20210619_df每次將新數據更新到 data.list 時都會發生更改並被替換。

假設原始目錄是:

Project/chris/company/Delta/force/run_20210619_df/total/data.list

但是今天data.list正在更新,因此在run_20210619_df仍然存在的同時形成了一個新目錄:Project/chris/company/Delta/force/run_20210624_df/total/data.list

並且目錄都包含data.list

我可以製作一個始終可以閱讀最新版本的 腳本data.list嗎?在這種情況下,它的內部run_20210624_df

我從這個開始:

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $files = './Project/chris/company/Delta/force/*/total/data.list';
my $hashref;

for my $file ( glob($files) ) {
   my($date) = (split('/',$_))[6];
   if( $hashref->{$id) and $date gt $hashref->{$id}{date} ) {
       $hashref->{$id}{file}   = $file;
       $hashref->{$id}{date}   = $date;
       $hashref->{$id}{count}  = count_lines($file);
   } else {
       $hashref->{$id}{file}   = $file;
       $hashref->{$id}{date}   = $date;
       $hashref->{$id}{count}  = count_lines($file);
   }
}

say Dumper($hashref);

sub count_lines {
   my $fname = shift;
   my $count;

   open my $fh, '<', $fname or die $!;
   $count++ while <$fh>;
   close $fh;

   return $count;
}

不幸的是,當我執行腳本時,它無法檢測到從哪個 data.list 中提取資訊。並因此列印 3 次,因為我有 3 個不同的 $date 文件

stat使用該函式按每個文件的修改時間戳對 glob 進行排序。

例如

代替:

for my $file ( glob($files) ) {

利用:

for my $file ( sort { (stat $b)[9] <=> (stat $a)[9] } glob($files) ) {

這將以相反的時間戳順序排序,即第一個元素將是最新的。

您可能不想遍歷與 glob 匹配的整個文件列表,只需使用最新的:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my $glob_pattern = './Project/chris/company/Delta/force/*/total/data.list';

my @files = ( sort { (stat $b)[9] <=> (stat $a)[9] } glob($glob_pattern) );
my $file = $files[0];

printf "%s: %i\n", $file, count_lines($file);

sub count_lines {
...
...
...
}

為什麼(stat $b)[9](stat $a)[9]?因為修改時間是函式返回的13個元素列表的第9個元素stat。它通常像這樣使用:

my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
   $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);

atime, mtime, 都是ctime數值,自紀元以來的秒數(格林威治標準時間 1970 年 1 月 1 日午夜) - 即標準 unix time_t 值。因為它們是數字的,所以可以像任何其他數值一樣對它們進行排序、比較、添加、減去等。

有關perldoc -f statstat 函式的更多詳細資訊,請參閱。

perldoc -f sort有關該sort功能的詳細資訊,另請參閱。在上面的程式碼中,它使用一個程式碼塊來根據從文件名(即它們的 mtimes)派生的值進行排序,而不是根據文件名本身進行排序。

順便說一句,請記住 perl 數組從 0 開始,而不是 1。所以

$$ 9 $$是第十個元素,從零開始。還,$$ 6 $$是第七個元素,所以你(split('/',$_))[6]可能應該是[5]而不是[6]. 現在不需要,因為上面的程式碼使用文件的實際時間戳。

引用自:https://unix.stackexchange.com/questions/655591