Update soundtest
[grml-scripts.git] / usr_bin / findwaste
1 #!/usr/bin/perl -w
2
3 # This script finds good directories for archiving based on the
4 # average age of files (access time) in the directory and the
5 # directory size.
6
7 # Directories whose size (in megabytes) is less than this value will
8 # not be displayed
9 my $size_minimum = 5;
10
11 # Directories whose average file age (in days) is less than this value
12 # will not be displayed
13 my $average_age_minimum = 30;
14
15 use strict;
16
17 die "Usage: $0 [directory1, directory2, ...]\n" unless @ARGV;
18
19 use File::Find;
20
21 # ---------------------------------------------------------------------------
22
23 # Global so that the callback can see them
24 my $total_files;
25 my $total_size;
26 my $total_age;
27
28 sub compute_age_callback
29 {
30   my $file_location = $File::Find::name;
31   my $filename = $_;
32
33   # Return if it's the '.' or '..' files;
34   return if $filename eq '.' || $filename eq '..';
35   # Return if it's a directory
36   return if -d $filename; 
37   # Ignore links
38   return if -l $filename; 
39
40   my @stats = stat $filename or die "Couldn't stat $filename: $!";
41   my $access_time = $stats[8];
42   my $size = $stats[7];
43
44   my $current_time = time;
45
46 #  print "# $file_location\n# Current: $current_time, Access time: $access_time\n";
47   my $age = $current_time - $access_time;
48   $total_age += $age;
49   $total_files++;
50
51   $total_size += $size;
52 }
53
54 sub compute_directory_stats
55 {
56   my $starting_directory = shift;
57
58   $total_age = 0;
59   $total_size = 0;
60   $total_files = 0;
61
62   find(\&compute_age_callback, $starting_directory);
63
64   return (0,0) if $total_files == 0;
65
66   return ($total_age / $total_files / 60 / 60 / 24,
67     $total_size / 1024 / 1024);
68 }
69
70 # ---------------------------------------------------------------------------
71
72 @ARGV = ('.') unless @ARGV;
73
74 my @directory_stats;
75
76 foreach my $directory (@ARGV)
77 {
78   next unless -d $directory;
79
80   my ($average_age, $size) = compute_directory_stats($directory);
81   push @directory_stats, [$directory, $average_age, $size];
82 }
83
84 @directory_stats = sort { $b->[2] <=> $a->[2] } @directory_stats;
85
86 @directory_stats = grep { $_->[2] > $size_minimum } @directory_stats;
87 @directory_stats = grep { $_->[1] > $average_age_minimum } @directory_stats;
88
89 foreach my $directory_stat (@directory_stats)
90 {
91   print "$directory_stat->[0]:\n";
92   my $size_string = sprintf 'Size: %6.2f megabytes', $directory_stat->[2];
93   my $age_string = sprintf 'Average age: %6.2f days', $directory_stat->[1];
94   printf '  %-38s%s', $size_string, $age_string;
95   printf "\n";
96 }