1

.jpgファイルをコピーするだけのスクリプトをいくつか修正しました。

スクリプトは機能しているようです。.jpgあるフォルダーから別のフォルダーにすべてのファイルをコピーしますが、スクリプトはX数秒ごとに継続的にループすることを意図しています。

.jpgスクリプトを既に開始した後にアイテムの移動元のフォルダーに新しいファイルを追加すると、新しく追加されたファイルはコピーされません。スクリプトを停止して再起動すると、追加された新しい.jpgファイルがコピーされますが、スクリプトを停止して再起動する必要がなく、フォルダーにアイテムをコピーする必要があります。

globg ファイルのみをコピーしようとする関数を追加する前は.jp、スクリプトがまだ実行されている間にフォルダーに移動されたとしても、スクリプトはフォルダー内のすべてをコピーしていました。

なぜこうなった?どんな助けでも素晴らしいでしょう。

これが私のコードです:

use File::Copy;
use File::Find;
my @source = glob ("C:/sorce/*.jpg");
my $target   = q{C:/target};

while (1)
{ sleep (10);
find(
   sub {
     if (-f) {
        print "$File::Find::name -> $target";
        copy($File::Find::name, $target)
         or die(q{copy failed:} . $!);

    }
    },
@source
); 

}
4

2 に答える 2

2

配列@sourceにはファイル名のリストが含まれています。検索を開始するフォルダーのリストが含まれている必要があります。そのため、単純に次のように変更します。

my $source = "C:/source";

保持する値は 1 つだけなので、スカラーに変更しました。後でディレクトリを追加する場合は、代わりに配列を使用できます。また、もちろん、なぜ glob と ? を混在させるのFile::Findですか? File::Find再帰的であるため、ほとんど意味がありません。

次に、必要なサブルーチンでファイルのチェックが行われます。

if (-f && /\.jpg$/i)
于 2013-01-31T20:50:33.850 に答える
0

リストを一度だけグロブすると、ファイルのリストは更新されません。私はFile::Find::Ruleを使用することを好み、リストを更新する代わりに、ディレクトリの反復ごとにそれを使用します。

use File::Find::Rule;

my $source_dir = 'C:/source';
my $target_dir = 'C:/target';

while (1) {
    sleep 10;
    my @files = File::Find::Rule->file()
                                ->name( '*.jpg' )
                                ->in( $source_dir );

    for my $file (@files) {
        copy $file, $target
            or die "Copy failed on $file: $!";
    }
}
于 2013-01-31T20:47:27.237 に答える