カタログから最新のデータを検索

カタログから最新のデータを検索

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_dfProject/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つの異なる$d​​ateファイルがあるため、3回印刷されます。

答え1

この関数を使用して、各ファイルの修正タイムスタンプに基づいてglobをソートしますstat

例えば

変える:

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、、、mtimectime新起源(GMT 1970年1月1日深夜)以降の秒数である数値です。つまり、標準の unix time_t 値です。数値なので、他の数値と同様に、ソート、比較、加算、減算などが可能です。

perldoc -f statstat関数の詳細については、参考資料を参照してください。

perldoc -f sortこの機能のsort詳細も参照してください。上記のコードでは、コードブロックを使用して、ファイル名自体ではなくファイル名から派生した値(つまり、mtimes)に基づいてソートします。

ところで、Perl配列は1ではなく0から始まるということを覚えておいてください。したがって、[9]は0から始まる10番目の要素です。また、[6]は7番目の要素であるため、代わりに使用する(split('/',$_))[6]必要があります。上記のコードはファイルの実際のタイムスタンプを使用するため、今は必要ありません。[5][6]

答え2

そしてzsh

wc -l < ./Project/chris/company/Delta/force/run_<->_df/total/data.list([-1])

data.list最も高い番号が付いた行が与えられますrun_..._df。しかし、

wc -l < ./Project/chris/company/Delta/force/run_<->_df/total/data.list(-om[1])

最近変更された行数を知らせますdata.list

または、パスで見つかった最初の数値シーケンスを数値で並べ替えますOn

wc -l < ./Project/chris/company/Delta/force/*/total/data.list(nOe['
  REPLY=${(MS)REPLY##<->}'][1])

1技術的には改行文字、最後の「行」が分離されていない場合、Perlメソッドとは異なる数字が提供されることがあります。

関連情報