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つの異なる$dateファイルがあるため、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
、、、mtime
はctime
新起源(GMT 1970年1月1日深夜)以降の秒数である数値です。つまり、標準の unix time_t 値です。数値なので、他の数値と同様に、ソート、比較、加算、減算などが可能です。
perldoc -f stat
stat関数の詳細については、参考資料を参照してください。
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
。
または、パスで見つかった最初の数値シーケンスを数値で並べ替えますO
。n
wc -l < ./Project/chris/company/Delta/force/*/total/data.list(nOe['
REPLY=${(MS)REPLY##<->}'][1])
1技術的には改行文字、最後の「行」が分離されていない場合、Perlメソッドとは異なる数字が提供されることがあります。