просмотр файла в каталоге с помощью perl

мне нужно смотреть файлы, которые попадают в каталог. Я закодировал приведенный ниже скрипт на perl. но он не делает то, что я хочу.

  1. всякий раз, когда прибывает файл или файлы, он должен совершить перемещение.
  2. И тогда ему снова приходится смотреть файлы.
  3. скрипт должен работать в фоновом режиме.

    #!/usr/bin/perl
    use warnings;
    use File::Copy qw(move);
    $src_dir = '/root/prasanna/dir';
    $tgt_dir = '/root/prasanna/dir/dir1';
    while (true) {
        opendir( DIR, "/root/prasanna/dir" )
            or die "Cannot open  /root/prasanna/dir: $!\n";
        my @Dircontent = readdir DIR;
        close DIR;
        my $items = @Dircontent;
        if ( $items > 2 ) {
            print "files available";
            while ($items) {
                print $items;
                move $src_dir. '/' . $items, $tgt_dir . '/' . $items;
                unlink $items;
            }
        }
        else { sleep 50; }
    }
    

Проблема с приведенным выше кодом: 1. оператор if продолжает печатать «доступные файлы». идет бесконечный цикл, он больше не ищет файлы. Даже если я выполняю операции с файлом, я не знаю, как заставить его снова искать файлы. 2. скрипт не работает в фоновом режиме.

Любая помощь высоко ценится . заранее спасибо.!


person prasannads    schedule 19.01.2015    source источник
comment
Пожалуйста, отформатируйте код, чтобы улучшить читаемость.   -  person Joeblade    schedule 19.01.2015
comment
Я только что попытался переформатировать/исправить ваш код - то, что вы туда вставили. Это а) незавершенное и б) выдача предупреждений. Исправьте предупреждения, включите use strict и отформатируйте свой код, и вы получите гораздо более точные ответы.   -  person Sobrique    schedule 19.01.2015
comment
@joeblade я не могу редактировать, чтобы поместить код в отдельные строки. тогда показывает ошибку.   -  person prasannads    schedule 19.01.2015
comment
Я применил редактирование, чтобы исправить форматирование. Мне пришлось добавить завершающую скобку, потому что она отсутствовала. Пожалуйста, можете ли вы проверить этот код, поскольку он отредактирован, это то, что у вас есть?   -  person Sobrique    schedule 19.01.2015
comment
@Sobrique, спасибо. Да, это.   -  person prasannads    schedule 19.01.2015
comment
выглядит намного лучше :) спасибо @Sobrique   -  person Joeblade    schedule 19.01.2015


Ответы (1)


предполагая, что вы работаете под Linux, используйте Linux::Inotify2...

use Linux::Inotify2;

# create an Inotify object
my $Inotify = Linux::Inotify2->new() or die "Fail: $!";

# choose which operations for which you wish to be notified
my $watchme = IN_CLOSE_WRITE | IN_CREATE | IN_MOVED_TO; # defined and exported

$Inotify->watch('/root/prasanna/dir', $watchme, \&watcher) or die "Fail: $!";

while (1) {
    $Inotify->poll;
}

sub watcher
{
  # do something here
}

Обратите внимание, что он может отслеживать только локальные файловые системы (т. е. без монтирования NFS).

person davidc    schedule 19.04.2017