我修改了一些我现在写的脚本,现在只复制.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
);
}
答案 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: $!";
}
}