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]은 일곱 번째 요소이므로 대신 사용해야 (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 방법과 다른 숫자가 제공될 수 있습니다.