Windows Vistaで現在のバージョンを実行しています。フォルダとその内容を別の場所にコピーするのに最適で簡単な方法を表示できるかどうかは疑問でした。内容にはさまざまなファイルが含まれており、おそらくいくつかのネストされたフォルダがあります。Perlを使用してディレクトリの内容を再帰的にコピーできますか?
これは私が知らないどこかにモジュールがなければならないと思っていますが、単純な自作型のソリューションがあればそれも見てみたいと思います。
Windows Vistaで現在のバージョンを実行しています。フォルダとその内容を別の場所にコピーするのに最適で簡単な方法を表示できるかどうかは疑問でした。内容にはさまざまなファイルが含まれており、おそらくいくつかのネストされたフォルダがあります。Perlを使用してディレクトリの内容を再帰的にコピーできますか?
これは私が知らないどこかにモジュールがなければならないと思っていますが、単純な自作型のソリューションがあればそれも見てみたいと思います。
File::Copy::Recursiveをご覧ください。
ファイルをコピーして処理しない場合は、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'
私の推測では、目標は主にそれらのファイルをコピーするのではなく、Perlの詳細を学ぶことです。 – Telemachus
@Telemachus:その場合、File :: Findを使って各ファイルのOSのcopyコマンドを呼び出すプログラムを書くことをお勧めします。 http://www.perlmonks.org/?node_id=295656 –
おそらく十分ですが、File :: Findは初心者のための簡単なモジュールではなく、再帰的なファイルやディレクトリのコピーを取得することも簡単な作業ではありません。私はそれがひどい運動であると言っているわけではありません。 – Telemachus
は、確かにそれは()を呼び出すdircopyように単純ではありませんか? – radicalmatt
いいえ、それは本当に簡単です。ファイルのインストール::コピー::再帰;そのドキュメントを読む。それをあなたのスクリプトにインポートします。これを使って。 CPANはPerlのキラーアプリです。 – Telemachus
実際には、2つの他のもの。まず、より多くのことを学ぶために、使用しているモジュールのソースをいつでも読むことができます。次に、私をシャーリーと呼ぶのをやめる。 – Telemachus