查找与文件数组中的模式匹配的文件

时间:2016-08-25 20:21:39

标签: perl

我的perl代码如下所示。尝试匹配模式的选择文件。

opendir ERR_STAGING_DIR, "$ERR_STAGING" or die "$PID: Cannot open directory $ERR_STAGING";
@allfiles = grep !/^$ERR_STAGING\/\./, map "$ERR_STAGING/$_", readdir(ERR_STAGING_DIR);
closedir(ERR_STAGING_DIR);

$ERR_FILETYPE = basename ($ERR_FILETYPE);

$ERR_FILETYPE =~ s/\./\\\./g;
$ERR_FILETYPE =~ s/\*/\*/g;

@file_type = grep /^$ERR_STAGING/./$ERR_FILETYPE$/, @allfiles;
$numelements = @file_type;
if ($numelements <= 0) {
    print LOG "$PID: No files match specified pattern, exiting.\n";
    &HandlerDie($NO_FILE_TYPE, $current_poid);
}

以上是我正在做的事情。从ERR_STAGING目录中获取所有文件。 grep文件匹配模式'BVN*.fin.bc_lerr.xml.bc',例如BVN_201608250000.fin.bc_lerr.xml.bc,并对文件执行某些操作。但是上面的代码返回的文件也与模式不匹配,它也会拾取一些临时目录。

2 个答案:

答案 0 :(得分:1)

纠正两行:

$ERR_FILETYPE =~ s/\*/.\*/g;                      # Add DOT

@file_type = grep /\/$ERR_FILETYPE$/, @allfiles;  # such a filter is sufficient  

答案 1 :(得分:1)

我打算提出另一种选择 - 你提到'BVN*.fin.bc_lerr.xml.bc'作为模式。

但这不是一个正则表达式(好吧,好吧,它是 - 但我很确定你不希望在N之后'你想要'零或更多BVN'。而你似乎正试图将其转换为正则表达式。

这意味着你实际上在寻找一个shell glob,而不是一个正则表达式。它们相似,但不一样。

我可以建议代替readdirgrep而不是glob

然后你可以:

my @files = glob ( '/path/to/BVN*.fin.bc_lerr.xml.bc' ); 

......就是这样。它将使用 shell 逻辑扩展您的模式,而不是正则表达式逻辑 - 然后读取/path/to以查找与之匹配的文件。

所以在你的例子中:

my @files = glob ( "$ERR_STAGING/$ERR_FILETYPE" );