Perl正则表达式针对预定义数组搜索文件名和扩展名

时间:2014-04-03 10:17:01

标签: perl

我想从目录中过滤掉一些文件。我能够递归地获取文件及其扩展,但现在我想做的是使用通配符搜索将文件扩展名和文件名与预定义的扩展和文件名数组匹配,就像我们在sql中所做的那样。

my @ignore_exts = qw( .vmdk .iso .7z .bundle .wim .hd .vhd .evtx .manifest .lib .mst );

我想过滤掉具有上述扩展名的文件。 例如文件名为abc.1.149_1041.mst,因为.mst中存在扩展名@ignore_ext,所以我希望将其过滤掉。我得到的扩展名为'.1.149_1041.mst'。和在sql中一样,我会做select * from <some-table> where extension like '%.mst'之类的事情。我想在perl中做同样的事情。

这是我用来抓取扩展名的。

my $ext = (fileparse($filepath, '\..*?')) [2];

2 个答案:

答案 0 :(得分:2)

为了从文件名中提取文件扩展名,这应该有效:

/^(.*)\.([^.]+)$/
$fileName = $1;
$extension = $2;

这可能适合你。

输入:a.b.c.text

$1将为a.b.c.d

$2将为text

基本上,这将包括从行的开头到最后一个句点的所有内容以及第一组中的所有内容,然后是从最后一个句点到第一个行的结尾的所有内容作为第2组

您可以在此处查看示例:http://regex101.com/r/vX3dK1

至于检查扩展是否存在于此处读取的数组中:(How can I check if a Perl array contains a particular value?

if (grep (/^$extension/, @array)) {
  print "Extension Found\n"; 
} 

答案 1 :(得分:0)

只需将您的扩展列表转换为正则表达式,然后针对$filepath进行测试。

my @ignore_exts = qw( .vmdk .iso .7z .bundle .wim .hd .vhd .evtx .manifest .lib .mst );
my $ignore_exts_re = '(' . join('|', map quotemeta, @ignore_exts) . ')$';

然后再进行比较

if ($filepath =~ $ignore_exts_re) {
    print "Ignore $filepath because it ends in $1\n";
    next;