Changed backup to work with new disks
[clearscm.git] / bin / bigfiles.pl
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         $RCSfile: bigfiles.pl,v $
5 # Revision:     $Revision: 1.3 $
6 # Description:  Reports large files
7 # Author:       Andrew@DeFaria.com
8 # Created:      Mon May 24 09:09:24 PDT 1999
9 # Modified:     $Date: 2011/04/18 05:15:29 $
10 # Language:     Perl
11 #
12 # (c) Copyright 2001, ClearSCM, Inc., all rights reserved
13 #
14 ################################################################################
15 use strict;
16 use warnings;
17
18 use FindBin;
19 use lib "$FindBin::Bin/../lib";
20
21 use Getopt::Long;
22
23 use OSDep;
24 use Display;
25
26 sub Usage {
27   display "Usage: bigfiles: [ -verbose | -v ] [ -size | -s n ] [ <directory> ]";
28   display "\t\t[ -top n | -t n ] [ -notop | -not ]\n";
29   display "Where:";
30   display "  -size | -s n\tShow only files bigger then n Meg (default 1 Meg)";
31   display "  -verbose | -v\tTurn on verbose mode (default verbose off)";
32   display "  -top | -t n\tPrint out only the top n largest files (default LINES - 1)";
33   display "  -notop|not\tPrint out all files (default top LINES - 1)";
34   display "  <directory>\tDirectory paths to check";
35   exit 1;
36 } # usage
37
38 sub Bigfiles {
39   my $size      = shift;
40   my @dirs      = @_;
41
42   my @files;
43
44   foreach (@dirs) {
45     next if !-d "$_";
46     my $cmd     = "find \"$_\" -xdev -type f -size +$size -exec ls -lLGQ {} \\;";
47     my @lines   = `$cmd`;
48
49     foreach (@lines) {
50       chomp;
51
52       my %info;
53
54       if (/\S+\s+\d+\s+(\S+)\s+(\d+).*\"\.\/(.*)\"/) {
55         $info {user}    = $1;
56         $info {filesize}        = $2;
57         $info {filename}        = $3;
58         push @files, \%info;
59       } # if
60     } # foreach
61   } # foreach
62
63   return @files;
64 } # Bigfiles
65
66 my $lines               = defined $ENV {LINES} ? $ENV {LINES} :-24;
67 my $top                 = $lines - 2;
68 my $bytes_in_meg        = 1048576;
69 my $block_size          = 512;
70 my $size_in_meg         = 1;
71 my %opts;
72
73 my $result = GetOptions (
74   \%opts,
75   usage     => sub { Usage },
76   verbose   => sub { set_verbose },
77   debug     => sub { set_debug },
78   'top=i',
79   'size=i',
80 );
81
82 my @dirs = @ARGV ? @ARGV : ".";
83
84 my $size = $opts {size} ? $opts {size} * $bytes_in_meg / $block_size : 4096;
85
86 # Now do the find
87 verbose "Directory:\t$_"
88   foreach (@dirs);
89 verbose "Size:\t\t$size_in_meg Meg ($size blocks)";
90 verbose "Top:\t\t$top";
91
92 my $head = $top ? "cat" : "head -$top";
93
94 my @files = Bigfiles $size, @dirs;
95
96 foreach (@files) {
97   my %info = %{$_};
98
99   print "${info {filesize}}\t${info {user}}\t${info {filename}}\n";
100 } # foreach