NAME File::Hotfolder - recursive watch directory for new or modified files SYNOPSIS use File::Hotfolder; # object interface File::Hotfolder->new( watch => '/some/directory', # which directory to watch callback => sub { # what to do with each new/modified file my $path = shift; ... }, delete => 1, # delete each file if callback returns true filter => qr/\.json$/, # only watch selected files print => WATCH_DIR # show which directories are watched | HOTFOLDER_ERROR, # show all errors (CATCH_ERROR | WATCH_ERROR) catch => sub { # catch callback errors my ($path, $error) = @_; ... } )->loop; # function interface watch( '/some/directory', callback => sub { say shift } )->loop; # watch a given directory and delete all new or modified files watch( $ARGV[0] // '.', delete => 1, print => DELETE_FILE )->loop; # watch directory, delete all new/modified non-txt files, print all files watch( '/some/directory', callback => sub { $_[0] !~ /\.txt$/ }, delete => 1, print => DELETE_FILE | KEEP_FILE ); DESCRIPTION This module uses Linux::Inotify2 to recursively watch a directory for new or modified files. A callback is called on each file with its path. Deletions and new subdirectories are not reported but new subdirectories will be watched as well. CONFIGURATION watch Base directory to watch. The "WATCH_DIR" event is logged for each watched (sub)directory and the "UNWATCH_DIR" event if directories are deleted. The "WATCH_ERROR" event is logged if watching a directory failed and if the watch queue overflowed. callback Callback for each new or modified file. The callback is not called during a write but after a file has been closed. The "FOUND_FILE" event is logged before executing the callback. delete Delete the modified file if a callback returned a true value (disabled by default). A "DELETE_FILE" will be logged after deletion or a "KEEP_FILE" event otherwise. fullname Return absolute path names. By default pathes are relative to the base directory given with option "watch". filter Filter file pathes with regular expression or code reference before passing to callback. Set to ignore all hidden files (starting with a dot) by default. Use 0 to disable. filter_dir Filter directory names with regular expression before watching. Set to ignore hidden directories (starting with a dot) by default. Use 0 to disable. print Which events to log. Unless parameter "logger" is specified, events are printed to STDOUT or STDERR. Possible event types are exported as constants "WATCH_DIR", "UNWATCH_DIR", "FOUND_FILE", "DELETE_FILE", "KEEP_FILE", "CATCH_ERROR", and "WATCH_ERROR". The constant "HOTFOLDER_ERROR" combines "CATCH_ERROR" and "WATCH_ERROR" and the constant "HOTFOLDER_ALL" combines all event types. logger Where to log events to. If given a code reference, the code is called with three named parameters: logger => sub { # event => $event, path => $path, message => $message my (%args) = @_; ... }, If given an object instance a logging method is created and called at the object's "log" method with argument "level" and "message" as expected by Log::Dispatch: logger => Log::Dispatch->new( ... ), The "level" is set to "error" for "HOTFOLDER_ERROR" events and "info" for other events. catch Error callback for failing callbacks (event "CATCH_ERROR"). Disabled by default, so a dying callback will terminate the program. scan First call the callback for all existing files. This does not guarantee that found files have been closed. METHODS loop Watch with a manual event loop. This method never returns. anyevent Watch with AnyEvent. Returns a new AnyEvent watch. inotify Returns the internal Linux::Inotify2 object. Future versions of this module may use another notify module (Win32::ChangeNotify, Mac::FSEvents, Filesys::Notify::KQueue...), so this method may return "undef". SEE ALSO File::ChangeNotify, Filesys::Notify::Simple AnyEvent COPYRIGHT AND LICENSE Copyright Jakob Voss, 2015- This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.