如何在perl中使用通配符递归复制?

时间:2013-01-31 20:33:35

标签: perl wildcard file-copying

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

该脚本似乎有效。它会将所有.jpg个文件从一个文件夹复制到另一个文件夹,但该脚本意味着每隔X秒钟连续循环。

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

在我添加glob函数尝试仅复制.jp g文件之前,脚本会复制文件夹中的任何内容,即使它在脚本仍在运行时已移入文件夹中。

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

这是我的代码:

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

}

2 个答案:

答案 0 :(得分:2)

您的@source数组包含文件名列表。它应该包含一个文件列表来开始搜索。所以只需将其更改为:

my $source = "C:/source";

我将其更改为标量,因为它只保存一个值。如果要在以后添加更多目录,可以使用数组。当然,为什么要混合一个glob和File::Find?没有意义,因为File::Find是递归的。

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

if (-f && /\.jpg$/i)

答案 1 :(得分: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: $!";
    }
}