74 lines
1.6 KiB
Perl
Executable File
74 lines
1.6 KiB
Perl
Executable File
#!@@@perl@@@
|
|
|
|
#
|
|
# Report wasted space.
|
|
#
|
|
# This basically prints a list of files and directories below a
|
|
# start point, where each entry is tagged with a "waste factor".
|
|
# The waste factor is a weighted sum of size, mtime and atime
|
|
# of the file.
|
|
#
|
|
|
|
sub wastefactor {
|
|
my ($size, $mtime, $atime) = @_;
|
|
|
|
return $size * $sf * ($mtime * $mf + $atime * $af);
|
|
}
|
|
|
|
|
|
sub waste {
|
|
my ($dir) = @_;
|
|
my $i;
|
|
my @files;
|
|
my ($mtime, $atime, $size);
|
|
my ($tmtime, $tatime, $tsize) = (0, 0, 0);
|
|
|
|
if (!opendir(DIR, $dir)) {
|
|
printf "$0: cannot open directory $dir: $!\n";
|
|
return;
|
|
}
|
|
@files = readdir(DIR);
|
|
closedir(DIR);
|
|
foreach $i (@files) {
|
|
if ($i eq "." || $i eq "..") { next }
|
|
|
|
$filename = $dir . "/" . $i;
|
|
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
|
|
$atime,$mtime,$ctime,$blksize,$blocks) =
|
|
stat($filename);
|
|
|
|
if (-d _) {
|
|
($size, $mtime, $atime) = waste($filename);
|
|
} else {
|
|
printf "%10.0f %d %d %d %s\n",
|
|
wastefactor(
|
|
$size, ($now - $mtime), ($now - $atime)),
|
|
$size, ($now - $mtime), ($now - $atime),
|
|
$filename;
|
|
}
|
|
$tsize += $size;
|
|
if ($mtime > $tmtime) {$tmtime = $mtime;}
|
|
if ($atime > $tatime) {$tatime = $atime;}
|
|
}
|
|
printf "%10.0f %d %d %d %s\n",
|
|
wastefactor(
|
|
$tsize, ($now - $tmtime), ($now - $tatime)),
|
|
$tsize, ($now - $tmtime), ($now - $tatime),
|
|
$dir;
|
|
return ($tsize, $tmtime, $tatime);
|
|
}
|
|
|
|
### --- main --- ###
|
|
$sf = 1.0/1000;
|
|
$mf = $af = 1.0/(3600*24*365.25);
|
|
|
|
if ($#ARGV != 0) {
|
|
print "Usage: $0 directoryname\n";
|
|
exit(1);
|
|
}
|
|
|
|
$now = time();
|
|
|
|
waste($ARGV[0]);
|
|
exit(0);
|