2016-07-07 10 views
2

ディレクトリに次のファイルがあります。区切り記号は "_"で、3番目のフィールドはファイルが作成された日付です。 これで、最初の列コードに従って日付が最も古いファイルを常に選択する必要があります。古いファイルを日付で返します

例:私は、結果として古いファイルを持っている必要があります。この場合

1020300000_XXXXXXXXX_20160707193000.TXT 
1020300000_XXXXXXXXX_20160707170000.TXT 
1020400000_XXXXXXXXX_20160707180000.TXT 
1020400000_XXXXXXXXX_20160707190000.TXT 

1020300000_XXXXXXXXX_20160707170000.TXT 
1020400000_XXXXXXXXX_20160707180000.TXT 

誰かが以前のファイルのみを返すのに役立つでしょうか?

+3

「1020300000_XXXXXXXXX_20160707193000.TXT」が「1020300000_XXXXXXXXX_20160707170000.TXT」より古いのはなぜですか?ディレクトリリストはすでに日付順にソートされていますか?最後の6桁はHHMMSSではありませんか? –

+0

はい、それです。 –

+2

@LeonardoBerbert - Casimirの質問にお答えできますか? – Arijit

答えて

-1

私はあなたの出力は

1020300000_XXXXXXXXX_20160707170000.TXT 
1020400000_XXXXXXXXX_20160707180000.TXT 

べきであると仮定します。そうでなければ、あなたの必要条件がわからない。とにかく私は、これはあなたが

#!/usr/bin/perl 

use Data::Dumper; 

# folder saves the files 
$folder = "test"; 

# save file names as array 
@files = `ls $folder`; 
chomp @files; 

foreach $file (@files){ 
     #split filename to 3 columns e.g. 
     #1020300000 XXXXXXXXX 20160707170000.TXT 
     ($col_1, $col_2, $col_3) = split(/_/, $file); 

     #delete .TXT 
     $col_3 =~ s/\.txt$//i; 

     #use my to create new @tmp every loop 
     my @tmp = ($col_3, $file); 

     #%outpput is our target result 
     #col_1 is key, the hash should look like this 
     # '1020300000' => [ 
     #     '20160707170000', <= this is col_3, will be used to compare later 
     #     '1020300000_XXXXXXXXX_20160707170000.TXT' <= condidate of the result 
     #     ] 
     unless(defined $output{$col_1}){ 
       $output{$col_1} = \@tmp; 
       next; 
     }; 

     $saved_col_3 = $output{$col_1}->[0]; 

     #because $col_1 are the same (key), so compare their col_3 value 
     if($col_3 < $saved_col_3){ 
       #update if this one is smaller 
       $output{$col_1} = \@tmp; 
     } 
} 

#print Dumper(\%output); 

#so.... 
foreach (keys %output){ 
     print "$output{$_}->[1]\n"; 
} 
0

あなたはあなたが必要な項目を返す、日付がYYYYMMDDHHMISSである事実を利用し、ちょうどそれらを並べ替えるだけで、トップ値を取得するためにハッシュを使用することができます必要なものであると思います。

あなたはこのようにそれを行うことができます
sub get_oldest_two { 
    my (@files) = @_; 

    my @sorted = sort { [split(/_/, $a)]->[2] lt [split(/_/, $b)]->[2] } @files; 
    my %file_dates = map { [split(/_/, $_)]->[0] => $_ } @sorted; 
    return reverse(sort((values(%file_dates))[0..1])); 
} 
1

use strict; 
use warnings; 
use feature qw(say); 

my $path = "./yourdir"; 
opendir (my $dh, $path) || die "Can't opendir $path: $!"; 

my @filelist = grep { -f "$path/$_" } readdir $dh; 

my @result = sort values {  # (4) 
    map +($_->[1], $_->[0]), # (3) 
    sort { $b->[2] cmp $a->[2] } # (2) 
    map [ $_, (split '_')[0,2] ], # (1) 
@filelist 
}; 

say join "\n", @result; 

は、(1)匿名の三つの要素の配列への参照のリストを返す
([ファイル名、FIRSTPART、thirdpart]、[ファイル名、FIRSTPART、thirdpart]、...)

(2)作成日を使用して(最新から最古に)降順にソートされたリストを返す(三分の一)。

(3) "FIRSTPART" と入力リストで参照される各アレイから "ファイル名" からなるリストを返す
(FIRSTPART、ファイル名、FIRSTPART、ファイル名を、.. 。)

(4)匿名のハッシュがリストとともに作成されます(中括弧はブロックまたは式を区切りませんが、ハッシュを定義します)。すべて firstpart が鍵となり、すべてファイル名が値になります。 ファイル名は以前から最新のものから古いものにソートされていたので、各キーは、同じキーのより新しい直前の値を上書きする最も古いファイル名と関連しています。

関連する問題