Perl的xcopy有方法fn_pat来指定模式匹配的正则表达式,我想用它来递归复制一个目录,忽略所有这些字符串的文件/文件夹:
.svn
build
test.blah
我对这样做的语法感到磕磕绊绊,我查看了许多perl正则表达式指南但是对于我的生活我只是无法掌握它。我感谢任何帮助。
感谢。
...更新......
我发现了一个似乎正常工作的perl正则表达式,而不是xcopy的fn_pat。不确定这是xcopy的错误还是我的表达不正确,但我的测试显示它没问题。
$exp = '^(?!.*(\.svn|build|test\.blah)).*$';
if( '/dev/bite/me/.svn' =~ $exp ){ print "A\n"; }
if( '/dev/bite/me/.svn/crumbs' =~ $exp ){ print "B\n"; }
if( '/dev/build/blah.ext' =~ $exp ){ print "C\n"; }
if( '/dev/crap/test.blah/bites' =~ $exp ){ print "D\n"; }
if( '/dev/whats/up.h' =~ $exp ){ print "E\n"; }
只有E打印,因为我希望。我很想知道这是否正确,以及为何不使用xcopy的任何想法。
答案 0 :(得分:1)
以下File::Xcopy
调用File::Find::finddepth
:
sub find_files {
my $self = shift;
my $cls = ref($self)||$self;
my ($dir, $re) = @_;
my $ar = bless [], $cls;
my $sub = sub {
(/$re/)
&& (push @{$ar}, {file=>$_, pdir=>$File::Find::dir,
path=>$File::Find::name});
};
finddepth($sub, $dir);
return $ar;
}
此处$re
是您的正则表达式。
根据File::Find
文档,除非使用$_
选项,否则no_chdir
将仅设置为所访问文件的叶名称。
我可以看到将no_chdir
选项传递给finddepth
的唯一方法是使用File::Xcopy::finddepth
进行修补:
use File::Xcopy;
*{"File::Xcopy::finddepth"} = sub {
my ($sub, $dir) = @_;
File::Find::finddepth({ no_chdir => 1, wanted => $sub}, $dir);
};