少なくとも 2 つの方法で、やりたいことを実行できます。
完全なパスでフィルタ
コールバックを呼び出すたびに、スカラー$File::Find::name
には完全なパスが含まれます。必要なファイルの直接の親は 6 桁の番号である必要があり、ファイルは同じ番号とサフィックスである必要があります。
それはこのように見えます。
#! /usr/bin/env perl
use strict;
use warnings;
use File::Find;
my $dir = @ARGV ? shift : "/Data";
my @filelist;
sub repmatch {
push @filelist, $File::Find::name
if $File::Find::name =~ m!/(\d{6})/\1_REP.kml$!;
}
find \&repmatch, $dir;
print "$_\n" for @filelist;
無視したいディレクトリを整理する
コールバックを設定$File::Find::prune
すると、残りの検索で現在のサブツリーが考慮されなくなります。
プルーニングにより、フィルターをより単純にすることができます。コールバックの呼び出しごと$_
に、ファイルの名前が含まれており、この時点まで残っているものはすべて、数字の後に続く接尾辞パターンに対してテストできます。直接の親の名前に対する制約をロックダウンする場合は、前のプログラムのテストを使用できます。
#! /usr/bin/env perl
use strict;
use warnings;
use File::Find;
my $dir = @ARGV ? shift : "/Data";
my @filelist;
sub repmatch {
$File::Find::prune = 1 if /^QC/ && -d;
push @filelist, $File::Find::name
if /^\d{6}_REP.kml$/;
}
find \&repmatch, $dir;
print "$_\n" for @filelist;
サンプル出力
ディレクトリ構造が与えられた場合
$ ls -R データ
データ:
123456 654321 QC
データ/123456:
123456_REP.kml
データ/654321:
654321_REP.kml
データ/QC:
123456_REP.kml 654321_REP.kml
上記のプログラムのいずれかを実行すると、次の出力が生成されます。
$ ./find-kml データ
データ/123456/123456_REP.kml
データ/654321/654321_REP.kml