1

我修改了一些我写的脚本,现在只复制.jpg文件。

该脚本似乎有效。它将所有.jpg文件从一个文件夹复制到另一个文件夹,但该脚本旨在每隔X几秒钟不断循环。

如果我.jpg在启动脚本之后将新文件添加到要从中移动项目的文件夹中,它将不会复制新添加的文件。如果我停止并重新启动脚本,那么它将复制.jpg添加的新文件,但我希望脚本在将项目放入文件夹时复制它们,而不必停止并重新启动脚本。

在我添加glob尝试仅复制.jpg 文件的函数之前,脚本将复制文件夹中的任何内容,即使在脚本仍在运行时将其移动到文件夹中也是如此。

为什么会这样?任何帮助都是极好的。

这是我的代码:

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";

我把它改成了一个标量,因为它只有一个值。如果您想稍后添加更多目录,可以使用数组代替。另外,当然,为什么要混合 glob 和File::Find? 它没有什么意义,因为File::Find是递归的。

然后在想要的子例程中完成文件检查:

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

如果您只 glob 一次列表,它将不会刷新其文件列表。我更喜欢使用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 回答