#!/usr/bin/perl use strict; # install liblinux-inotify2-perl use Linux::Inotify2; # install libdatetime-format-mail-perl use DateTime::Format::Mail; my $inotify = new Linux::Inotify2; $inotify->watch(".", IN_CLOSE_WRITE | IN_MOVED_TO) or die($!); # scan directory at launch opendir(my $dh, ".") or die($!); while(my $file=readdir($dh)) { ProcessFile($file); } closedir($dh); # keep watching for changes while(my @events = $inotify->read()) { foreach my $event(@events) { ProcessFile($event->{name}); } } sub ProcessFile { my ($name) = @_; if ($name =~ /^\d+$/) { print "Processing file $name\n"; my $subject; my $date; open(my $fh, "<", $name) or die($!); while(my $line = readline($fh)) { chomp($line); if ($line eq "") { last; } elsif ($line =~ /^subject\:\s*(.*)$/i) { $subject = $1; } elsif ($line =~ /date\:\s*(.*)$/i) { $date = $1; } } close($fh); # format subject if (defined($subject)) { $subject =~ s/\s+/-/g; } else { $subject = "no-subject"; } # format date eval { # RFC2822 "Sat, 29 Mar 2003 22:11:18 -0800" $date = DateTime::Format::Mail->parse_datetime($date); $date = $date->ymd(); } or do { $date = "no-date"; }; # find unused file name my $name2; my $dup=0; while(1) { $name2 = $date."_".$subject; if ($dup>0) { $name2 .= "($dup)"; } $name2 .= ".eml"; if (!-e $name2) { last; } $dup += 1; if ($dup>500) { print "Too many dups\n"; return; } } print "Renaming to $name2\n"; rename($name,$name2) or die($!); } }