我想从目录中过滤掉一些文件。我能够递归地获取文件及其扩展,但现在我想做的是使用通配符搜索将文件扩展名和文件名与预定义的扩展和文件名数组匹配,就像我们在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];
答案 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;