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



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

示例:

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";
    }
 }

您可能需要了解正则表达式和模式匹配,因为您没有使用正确的语法。尝试如下:

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

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

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

您可以使用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: $!";
    }
}

使用*让人想起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: $!";
}
^abc_key_[^.]*.kwd$

试试这个。这将只匹配需要您需要的文件。请参阅演示。

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

最新更新