# purgeToMostRecent.pl purges files in a directory so all that remain are the n most recent. # Written 30-jul-2004 by fgb. # # Modus: read folder & populate hash containing timestamp and filenames; sort by timestamp; # then delete all but the top n files. require "ctime.pl"; use Getopt::Long; use Time::Local; my $bDebug = 0; my $sAppName = 'purgeToMostRecent'; my $sDate = &ctime(time); chop $sDate; my $nDirsRead = 0; my %files; my $sFolder = '.'; #my $sFolder; my $bHelp = 0; my $i = 0; my $nKeep = 3; # default to 3 files my $bListOnly = 0; my $bVerbose = 0; my $sVersion = "1.0"; $result = GetOptions('/|-','help|?'=>\$bHelp,'debug'=>\$bDebug,'list'=>\$bListOnly,'keep=i'=>\$nKeep,"dir=s"=>\$sFolder); if (! $result) { errExit("can't process command line option(s)"); } if ($bDebug) { $bVerbose = 1; $bListOnly = 1; print "dbg: debug ON\nkeep=$nKeep dir=$sFolder\n"; } if ($bHelp) { help(); exit; } MAIN: processDir($sFolder); # sort comparison operator <=> uses numeric instead of ascii sorting # sort comparison function compares $b to $a for descending order foreach $f (sort {$files{$b} <=> $files{$a}} keys %files) { ++$i; if ($bListOnly) { print "$f: $files{$f}"; if ($i <= $nKeep) { print " (keep)"; } else { print " (delete)"; } print "\n"; } elsif ($i > $nKeep) { unlink $f; if ($bVerbose) { print "deleted $f\n"; } } } # subroutines: sub errExit { $s = "Error: " . @_[0]; print "$s\n"; print "$sAppName terminated\n"; exit; } sub help { printf("%s version %s\n",$sAppName,$sVersion); print "Purges files in a directory so all that remain are the n most recent\n"; print "\nusage: $sAppName [/dir=] [/keep=n] [/list]\n"; print "\n/dir defaults to current default directory if not specified\n"; print "/keep (# of files) value defaults to 3 if not specified\n"; print "/list prints files which would be purged but does not delete them\n"; } sub processDir { local $sDir = $_[0]; if (!length($sDir)) { return; } if ($sDir eq "..") { return; } print "processing folder $sDir...\n"; if (!opendir(FLDR,$sDir)) { print "Can't open folder $sDir\n"; return; } ++$nDirsRead; local @filenames = readdir(FLDR); # get list of files closedir(FLDR); foreach (@filenames) { if ($_ eq "." || $_ eq "..") { next; } $sFile = $sDir; if ($sDir !~ m/\\+$/) { $sFile .= "\\"; } # if no \\ then add one $sFile .= $_; if ( -f $sFile) { &processFile($sFile); } else { if ($bRecurse) { &processDir($sFile); } } } } sub processFile { ($timestamp) = (stat($_[0]))[9]; # time last modified # if ($bDebug) { # ($jq,$jq,$jq,$dd,$mm,$yy,$jq,$jq,$jq) = localtime($timestamp); # $yy += 1900; # ++$mm; # print "dbg: $_[0] mod $mm-$dd-$yy\n"; # } $files{$_[0]} = $timestamp; # add to hash } __END__