2009-07-13 25 views
5

Windows Vistaで現在のバージョン​​を実行しています。フォルダとその内容を別の場所にコピーするのに最適で簡単な方法を表示できるかどうかは疑問でした。内容にはさまざまなファイルが含まれており、おそらくいくつかのネストされたフォルダがあります。Perlを使用してディレクトリの内容を再帰的にコピーできますか?

これは私が知らないどこかにモジュールがなければならないと思っていますが、単純な自作型のソリューションがあればそれも見てみたいと思います。

答えて

14

File::Copy::Recursiveをご覧ください。

+0

は、確かにそれは()を呼び出すdircopyように単純ではありませんか? – radicalmatt

+0

いいえ、それは本当に簡単です。ファイルのインストール::コピー::再帰;そのドキュメントを読む。それをあなたのスクリプトにインポートします。これを使って。 CPANはPerlのキラーアプリです。 – Telemachus

+6

実際には、2つの他のもの。まず、より多くのことを学ぶために、使用しているモジュールのソースをいつでも読むことができます。次に、私をシャーリーと呼ぶのをやめる。 – Telemachus

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' 
+0

私の推測では、目標は主にそれらのファイルをコピーするのではなく、Perlの詳細を学ぶことです。 – Telemachus

+0

@Telemachus:その場合、File :: Findを使って各ファイルのOSのcopyコマンドを呼び出すプログラムを書くことをお勧めします。 http://www.perlmonks.org/?node_id=295656 –

+0

おそらく十分ですが、File :: Findは初心者のための簡単なモジュールではなく、再帰的なファイルやディレクトリのコピーを取得することも簡単な作業ではありません。私はそれがひどい運動であると言っているわけではありません。 – Telemachus

関連する問題