如何使用Perl递归复制目录的内容?

时间:2009-07-13 06:30:53

标签: perl recursion copy

我正在Windows Vista上运行当前版本的ActivePerl,我想知道您是否可以向我展示将文件夹及其内容复制到另一个位置的最佳和最简单的方法。内容将包括各种文件,并且很可能包含一些嵌套文件夹。

我想我必须有一个模块在那里,我不知道这是做什么的 - 但如果有一个简单的自制类型的解决方案,我也希望看到它。

2 个答案:

答案 0 :(得分:14)

答案 1 :(得分:0)

如果您只是复制而不对文件进行任何处理,则没有理由不使用xcopy

现在,我根据Telemachus的评论编写了以下脚本,为您提供了一个起点。如果需要处理文件内容,我个人会坚持使用xcopy进行复制和File::Find。此外,我相信下面的代码中有大约37个错误。但是,如果你想玩,它可能是有益的:

#!/usr/bin/perl

use strict;
use warnings;

use File::Spec::Functions qw( catfile );

die "mydeepcp src-dir target-dir\n" unless @ARGV == 2;

my ($src, $target) = @ARGV;
mydeepcp( $src => $target );

sub mydeepcp {
    my ($src, $target) = @_;

    opendir my $dir_h, $src
        or die "Cannot open directory: '$src': $!";

    while ( my $file = readdir $dir_h ) {
        next if $file =~ m{^\.\.?$};
        my $src_path = catfile $src => $file;
        my $target_path = catfile $target => $file;

        if ( -d $src_path ) {
            # FIXME: insert code somewhere to create destination dir 
            mydeepcp($src_path => $target_path);
        }
        elsif ( -f _ ) {
            if ( my $err = docp($src_path => $target_path) ) {
                warn sprintf(
                    "Error copying '%s' from '%s' to '%s': %s\n",
                    $file, $src, $target, $err
                );
            }
        }
        else {
            warn "Skipping '$src_path'\n";
        }
    }

    closedir $dir_h;
    return;
}

sub docp {
    my ($src, $target) = @_;
    warn "'$src' => '$target'\n";
    return;
}

__END__

输出:

C:\Temp> ghj c:\windows f:\qwert
...
'C:\windows\$hf_mig$\KB899591\update\spcustom.dll' => 'F:\qwert\$hf_mig$\KB899591\update\spcustom.dll'
'C:\windows\$hf_mig$\KB899591\update\update.exe' => 'F:\qwert\$hf_mig$\KB899591\update\update.exe'
'C:\windows\$hf_mig$\KB899591\update\update.ver' => 'F:\qwert\$hf_mig$\KB899591\update\update.ver'