当前位置:  开发笔记 > 编程语言 > 正文

如何递归复制目录并在Perl中过滤文件名?

如何解决《如何递归复制目录并在Perl中过滤文件名?》经验,为你挑选了3个好方法。

如何复制包含子目录的目录,不包括与Windows系统上的某个正则表达式匹配的文件或目录?



1> Leon Timmerm..:

我会做这样的事情:

use File::Copy;
sub copy_recursively {
    my ($from_dir, $to_dir, $regex) = @_;
    opendir my($dh), $from_dir or die "Could not open dir '$from_dir': $!";
    for my $entry (readdir $dh) {
        next if $entry =~ /$regex/;
        my $source = "$from_dir/$entry";
        my $destination = "$to_dir/$entry";
        if (-d $source) {
            mkdir $destination or die "mkdir '$destination' failed: $!" if not -e $destination;
            copy_recursively($source, $destination, $regex);
        } else {
            copy($source, $destination) or die "copy failed: $!";
        }
    }
    closedir $dh;
    return;
}



2> dwarring..:

另一个选项是File :: Xcopy.顾名思义,它或多或少模仿windows xcopy命令,包括其过滤和递归选项.

从文档:

    use File::Xcopy;

    my $fx = new File::Xcopy; 
    $fx->from_dir("/from/dir");
    $fx->to_dir("/to/dir");
    $fx->fn_pat('(\.pl|\.txt)$');  # files with pl & txt extensions
    $fx->param('s',1);             # search recursively to sub dirs
    $fx->param('verbose',1);       # search recursively to sub dirs
    $fx->param('log_file','/my/log/file.log');
    my ($sr, $rr) = $fx->get_stat; 
    $fx->xcopy;                    # or
    $fx->execute('copy'); 

    # the same with short name
    $fx->xcp("from_dir", "to_dir", "file_name_pattern");



3> moritz..:

如果您碰巧在类Unix操作系统上并且可以访问rsync (1),那么您应该使用它(例如通过system()).

Perl的File :: Copy有点坏(例如,它不会复制Unix系统上的权限),因此如果您不想使用系统工具,请查看CPAN.也许File :: Copy :: Recursive可能有用,但我没有看到任何排除选项.我希望别人有更好的主意.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有