模式匹配在复制文件时不起作用

时间:2014-10-23 03:08:46

标签: regex perl

我想将一些特定文件从文件夹复制到另一个文件夹。源文件夹包含以下类型的文件:

示例:

abc_key_in.rsb
abc_key_in_at.rsb
abc_key_in.kwd
abc_key_in_at.kwd...

我必须复制以abc_key_作为前缀且.kwd作为扩展名的文件....

我试过这段代码,但模式匹配不起作用......

foreach $filename(@files)
{   

   if($file_name =~/abc_key_*.kwd/) <--- Not working
   {
        print $file_name;
        cp($file_name,$dest_dir.$file_name) #or die "Failed to copy $file_name :$!\n";
    }
 }

4 个答案:

答案 0 :(得分:1)

您可能希望阅读正则表达式和模式匹配,因为您没有使用正确的语法。试试这样:

if ($file_name =~ /^abc_key_.*\.kwd$/) {
    # ...
}

正则表达式中使用的元字符:

  • ^ 表示字符串的开头
  • . 是通配符
  • * 是量词(0或更多)
  • \. 是字面点字符
    (需要转义点,因为否则它将被解释为通配符)
  • $ 表示字符串的结尾

答案 1 :(得分:1)

您可以使用File::Find查找文件,File::Copy复制文件,如下所示:

#!/usr/bin/perl

use strict;
use warnings;

use File::Find;
use File::Copy;
use File::Path qw(make_path);
use File::Spec::Functions qw(rel2abs);

my $src = rel2abs('src');
my $dest = rel2abs('dest');

# create destination directory
make_path("$dest");

# find and copy files
find(\&wanted, $src);

sub wanted {
    if (m/^abc_key_.*\.kwb$/) {
        copy($File::Find::name, $dest) or die "Copy failed: $!";
    }
}

答案 2 :(得分:1)

您对*的使用让人联想到shell通配符,而不是正则表达式。

为此,您需要glob

use strict;
use warnings;

use File::Copy;

my $src_dir  = '/foo/bar';
my $dest_dir = '/biz/baz';

for my $file ( glob("$src_dir/abc_key_*.kwd") ) {
    copy( $file, $dest_dir ) or die "Can't copy $file to $dest_dir: $!";
}

或者,我建议使用Path::Class进行跨平台兼容的文件和目录处理:

use strict;
use warnings;

use Path::Class;

my $src_dir  = dir('/foo/bar');
my $dest_dir = dir('/biz/baz');

for my $file ( $src_dir->children ) {
    next if $file->is_dir || $file !~ /abc_key_.*\.kwd$/;
    $file->copy_to($dest_dir) or die "Can't copy $file: $!";
}

答案 3 :(得分:0)

^abc_key_[^.]*\.kwd$

试试这个只匹配需要你的文件。参见演示。

http://regex101.com/r/aX5eP7/2