카탈로그에서 최신 데이터 검색

카탈로그에서 최신 데이터 검색

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 statstat 함수에 대한 자세한 내용은 참고자료를 참조하세요.

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 방법과 다른 숫자가 제공될 수 있습니다.

관련 정보