0

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 一起使用的任何想法。

4

1 回答 1

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);
};
于 2011-09-09T03:45:40.807 回答