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

Regex 复制文件时模式匹配不起作用,regex,perl,Regex,Perl,我想将一些特定文件从一个文件夹复制到另一个文件夹。源文件夹包含以下类型的文件: 例如: abc_key_in.rsb abc_key_in_at.rsb abc_key_in.kwd abc_key_in_at.kwd... 我必须复制前缀为abc\u key\u且扩展名为.kwd的文件 我已经尝试过这个代码,但是模式匹配不起作用 foreach $filename(@files) { if($file_name =~/abc_key_*.kwd/) <--- Not wo

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

例如:

abc_key_in.rsb
abc_key_in_at.rsb
abc_key_in.kwd
abc_key_in_at.kwd...
我必须复制前缀为
abc\u key\u
且扩展名为
.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";
    }
 }
foreach$filename(@files)
{   

如果($file\u name=~/abc\u key\u*.kwd/)您可能需要了解正则表达式和模式匹配,因为您没有使用正确的语法。请尝试以下操作:

if ($file_name =~ /^abc_key_.*\.kwd$/) {
    # ...
}
#!/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: $!";
    }
}
正则表达式中使用的元字符:

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

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

if ($file_name =~ /^abc_key_.*\.kwd$/) {
    # ...
}
#!/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通配符,而不是正则表达式

为此,您需要:

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

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: $!";
}