Updated testspeed
[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
47     my $lsOpts  = $ARCHITECTURE eq 'solaris' ? '-loL' : '-lLG';
48     my $cmd     = "find \"$_\" -xdev -type f -size +$size -exec ls $lsOpts {} \\;";
49     my @lines   = `$cmd`;
50
51     foreach (@lines) {
52       chomp;
53
54       my %info;
55
56       #if (/\S+\s+\d+\s+(\S+)\s+(\d+).*\"\.\/(.*)\"/) {
57       if (/\S+\s+\d+\s+(\S+)\s+(\d+)\s+\S+\s+\S+\s+\d+\s+(.*)/) {
58         $info {user}     = $1;
59         $info {filesize} = $2;
60         $info {filename} = $3;
61
62         push @files, \%info;
63       } # if
64     } # foreach
65   } # foreach
66
67   return @files;
68 } # Bigfiles
69
70 my $lines        = $ENV{LINES} || 24;
71 my $top          = $lines - 2;
72 my $bytes_in_meg = 1048576;
73 my $block_size   = 512;
74 my $size_in_meg  = 1;
75 my %opts = (
76   size => 1
77 );
78
79 my $result = GetOptions (
80   \%opts,
81   usage     => sub { Usage },
82   verbose   => sub { set_verbose },
83   debug     => sub { set_debug },
84   'top=i',
85   'size=i',
86 );
87
88 my @dirs = @ARGV > 0 ? @ARGV : '.';
89 my $size = $opts{size} ? $opts{size} * $bytes_in_meg / $block_size : 4096;
90 my @files;
91
92 # Now do the find
93 verbose "Directory:\t@dirs";
94
95 for (@dirs) {
96   verbose "Size:\t\t$opts{size} Meg ($size blocks)";
97   verbose "Top:\t\t$top";
98
99   my $head = $top ? "cat" : "head -$top";
100
101   @files = Bigfiles $size, @dirs;
102 } # for
103
104 for (sort {$b->{filesize} <=> $a->{filesize}} @files) {
105   my %info = %{$_};
106
107   last if $top-- == 0;
108
109   print "${info {filesize}}\t${info {user}}\t${info {filename}}\n";
110 } # for