0

最新のサブディレクトリをネットワーク パス上に配置し、最新のサブディレクトリの内容全体をネットワーク パス内の別のフォルダにコピーしたい

フォルダーの下にたくさんのサブフォルダーがあります\\10.184.132.202\projectdump。サブフォルダーを並べ替えて最新のフォルダーに移動し、コンテンツ全体を別のフォルダーにコピーする必要があります\\10.184.132.203\baseline

以下のスクリプトを使用しています。ディレクトリの下に最新の変更されたフォルダーを一覧表示できますが、内容をコピーすることはできません。

use File::stat;
use File::Copy qw(copy);
$dirname = '\\\\10.184.132.202\\projectdump\\Testing\\';
$destination = '\\\\10.184.132.203\\baseline\\Testing\\';
$timediff=0;
opendir DIR, "$dirname";
while (defined ($sub_dir = readdir(DIR)))
{
    if($sub_dir ne "." && $sub_dir ne "..")
    {
        $diff = time()-stat("$dirname/$sub_dir")->mtime;
        if($timediff == 0)
        {
            $timediff=$diff;
            $newest=$sub_dir;
        }
        if($diff<$timediff)
        {
            $timediff=$diff;
            $newest=$sub_dir;
        }
    }
}
print $newest,"\n";

open my $in, '<', $newest or die $!;
while (<$in>) {
    copy *, $destination; --------> Here i want to copy the entire contents of the $newest to $destination.
}
4

2 に答える 2

1

File::Copy::Recursiveを使用します。これはオプションのモジュールですが、ディレクトリ ツリー全体をコピーできます。残念ながら、File::Copy::Recursive標準の Perl モジュールではありませんが、コマンドを使用してインストールできますcpan

モジュールのインストールに問題がある場合 (場合によってはそうなる場合もあります)、File::Findを使用してディレクトリ ツリーを調べ、ファイルを 1 つずつコピーできます。

ちなみに、Perl では Windows のファイル名にスラッシュを使用できるので、バックスラッシュを 2 つ重ねる必要はありません。

于 2012-08-31T14:15:20.650 に答える
0

最新のディレクトリを見つけるために単純なシェルコマンドを呼び出さないのはなぜですか? これはシェルではるかに簡単になると思います...

my $newestdir=`ls -1rt $dirname|tail -n 1`;

シェル内:

LATESTDIR=`ls -1rt $dirname|tail -n 1`
cp -r ${LATESTDIR}/* $destination/

Ups、Windows を使用している可能性があることに気付きました...

すべてのディレクトリとその時間をハッシュに取得し、そのハッシュを逆順にソートして最新のものを見つけます

my ($newest) = sort {$hash{$b} cmp $hash{$a} keys %hash;

それから

opendir NDIR, "$newest";
while ($dir=<NDIR>) {
next if $dir eq '.' or $dir eq '..';
copy $dir, $destination;
}
于 2012-08-31T10:34:51.277 に答える