我想将一些特定文件从文件夹复制到另一个文件夹。源文件夹包含以下类型的文件:
示例:
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";
}
}
答案 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)