#!/usr/bin/perl -w use strict; use File::stat; my $verbose = 0; my $nop = 0; sub usage { print STDERR "Usage: $0 [-d days] dir ...\n"; exit(1); } sub cleandir { my ($dir, $since, $level) = (@_); my $notremoved = 0; if ($verbose > 1) { print STDERR "$0:", " " x $level, " cleandir $dir $since {\n"; } if (!opendir(DIR, $dir)) { printf STDERR "$0:", " " x $level, " cannot opendir $dir: $!"; return; } for my $i (readdir(DIR)) { if ($i eq "." || $i eq "..") {next} if ($verbose > 2) { print STDERR "$0:", " " x $level, " checking $dir/$i\n"; } my $st = lstat("$dir/$i"); if ($verbose > 3) { print STDERR "$0:", " " x $level, " mtime=", $st->mtime, " atime=", $st->atime, "\n"; } if (-d _) { if (cleandir("$dir/$i", $since, $level+1) == 0 && $st->mtime < $since) { if (rmdir("$dir/$i")) {next} } } elsif ($st->mtime < $since && $st->atime < $since) { if ($nop) { print "would remove $dir/$i\n"; } else { if ($verbose > 0) { print STDERR "$0:", " " x $level, " removing $dir/$i\n"; } if (unlink("$dir/$i")) {next} print STDERR "$0:", " " x $level, " removing $dir/$i failed: $!/$i\n"; } } $notremoved++; } if ($verbose > 1) { print STDERR "$0:", " " x $level, " cleandir: $notremoved }\n"; } return $notremoved; } sub main { my $since = time() - 14 * 86400;; my $i; while ($i = shift(@ARGV)) { if ($i eq "-d") { my $days = shift(@ARGV); $since = time() - $days * 86400; } elsif ($i eq "-v") { $verbose++; } elsif ($i eq "-n") { $nop++; } else { cleandir($i, $since, 0); } } exit(0); } main();