使用perl的File :: Xcopy来复制使用正则表达式忽略文件的目录

时间:2011-09-08 21:51:22

标签: regex perl xcopy

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的任何想法。

1 个答案:

答案 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);
};