如何使用Perl的grep通过匹配名称中的模式来查找特定文件

时间:2012-04-11 13:37:44

标签: perl file grep design-patterns matching

我有一个存储在Perl变量中的字符串,该字符串应该与存储在目录中的文件名的开头部分相匹配。

我使用此变量使用Perl的grep从目录中查找与此模式匹配的文件。这就是我在做的事情:

    opendir (DIR, "data/testroot/") or die "$!";
    @file1 = <$f1/*.hdf>
    foreach(@file1){
       $patt = substr(basename($_),0,$ind);
       $file2 = grep {/${patt}*\.hdf/} readdir(DIR);
       #other code follows.......
    }
    closedir(DIR);

首先,我获取文件夹f1中所有文件的列表,并将它们存储在数组@file中。然后,对于@file1中的每个条目,我提取前几个字符,将它们存储在$patt中,然后尝试从另一个文件夹data/testroot/中选择具有匹配的开始模式的类似文件在$patt

grep $file2 = grep {/${patt}*\.hdf/} readdir(DIR);无效。

2 个答案:

答案 0 :(得分:1)

我想你想找到目录A中的所有*.hdf文件,其文件名与目录B中任何此类文件的第一个$ind字符匹配?

您应该对两个目录使用globreaddir,但不能同时使用两者。在这种情况下,glob似乎是最好的选择,因为它允许您从A中选择所有*.hdf文件,而无需使用正则表达式进行检查。

以下程序似乎可以满足您的需求。我已替换$f1$ind的示例值。

use strict;
use warnings;

use File::Basename;

my $f1 = 'data';
my $f1 = 'data/testroot';
my $ind = 6;

foreach (glob "$f1/*.hdf") {
  my $patt = substr(basename($_), 0, $ind);
  my @match = glob "$f2/$patt*.hdf";

  #other code follows.......
}

答案 1 :(得分:0)

${patt}*\.hdf表示“0次或更多次出现$ patt,后跟.hdf”。你确定你不是指“$ patt,后跟任意文本,然后是.hdf”?

那将是/${patt}.*\.hdf/