2016-09-28 3 views
0

ファイル名でファイルをフィルタリングしようとしています。grepがファイル名の最初の12文字だけをスキャンできるようにするにはどうすればよいですか?

2つの日付を入力するように求められたら、私のコードはすべてのファイルを調べ、検索パラメータに適合するすべてのファイルを配列に書き込みます。

しかし、私が2014 .. 2016のような不正確な範囲を入力した場合、最初の2つのファイルのように、私の検索に関係のないファイル(私は最初の8文字だけが日付スタンプを表すのでgrepしたいので) @filesには、名前に2014年、2015年または2016年が含まれているため、フィルタリングされています。

@files = 20120830_600020143_1_Log.csv (wrong because year 2012) 
     20130830_600020161_1_Log.csv (wrong because year 2013) 
     20150830_600020162_1_Log.csv 
     20160830_600020121_1_Log.csv 

ファイル名の最初の12文字だけをgrepする方法はありますか?

私はsubstrとの組み合わせを考えましたが、動作させることができませんでした。

変更する必要のあるコードは次のとおりです。この場合、$daterangeあなたはそれぞれのファイル名の最初の8文字だけを検索したいようですね"2016"

foreach $folder (@folder) { 

    $curdir = "$scriptdir\\$folder"; 

    opendir my $dir_b, "$curdir" or die "Can't open directory: $!"; 
    my @files = grep { /$daterange/ } readdir $dir_b; 
    closedir $dir_b; 

    foreach $files (@files) { 
     ... 
    } 
+1

のように、whileループでreaddirを使用することを好むこの

my @files = grep { substr($_, 0, 8) =~ $daterange } readdir $dir_b; 

のように見えるのでしょうか? – ernix

+0

^regex =すばらしいもの。あなたを助ける素晴らしいリソースhttp://regexr.com/ –

+0

はい、^ファイル名の冒頭にある2016だけを探しますか?どういうわけか、これは、これが引き起こす可能性のあるエラーについて考えることができますが、名前の構文が同じである限り、何も見つかりません。ありがとうございます –

答えて

7

です。それは私が "/^$の日付範囲" に "/ $ DATERANGE /" この

foreach $folder (@folder) { 

    my $curdir = "$scriptdir\\$folder"; 

    opendir my $dh, $curdir or die qq{Unable to open directory "$curdir": $!}; 

    while (my $node = readdir $dh) { 

     next if $node eq '.' or $node eq '..'; 
     next unless substr($node, 0, 8) =~ $daterange; 

     my $fn = "$curdir\\$node"; 
     next unless -f $fn; 

     # Do stuff with $fn 
    } 
} 
+0

ありがとう! –

関連する問題