Как рекурсивно копировать с подстановочными знаками в Perl?

Я модифицировал написанный мною сценарий, чтобы теперь копировались только .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
); 

}

person Nightzrain    schedule 31.01.2013    source источник


Ответы (2)


Ваш массив @source содержит список имен файлов. Он должен содержать список папок для начала поиска. Поэтому просто измените его на:

my $source = "C:/source";

Я изменил его на скаляр, потому что он содержит только одно значение. Если вы хотите добавить больше каталогов позже, вместо этого можно использовать массив. Кроме того, конечно, зачем смешивать глобус и File::Find? Это не имеет большого смысла, так как File::Find является рекурсивным.

Затем проверка файла выполняется в требуемой подпрограмме:

if (-f && /\.jpg$/i)
person TLP    schedule 31.01.2013
comment
Спасибо. Ваше право, это имеет больше смысла. Я просто пытался найти способ добавить подстановочные знаки. - person Nightzrain; 01.02.2013
comment
@Nightzrain Я понятия не имею, что вы имеете в виду, когда говорите подстановочные знаки. Если вы считаете, что этот ответ ответил на ваш вопрос, отметьте его как принятый. - person TLP; 01.02.2013

Он не будет обновлять свой список файлов, если вы только один раз подберете список. Я предпочитаю использовать File::Find:: Правило и будет использовать его для каждой итерации каталога вместо обновления списка.

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: $!";
    }
}
person titanofold    schedule 31.01.2013