3c539c2c3590ec8e1a65e8cdca64fde824bf3c0d
[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 -lLG {} \\;";
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       if (/\S+\s+\d+\s+(\S+)\s+\S+ \S+\s+(\d+)\s+\S+\s+\d+\s+\S+\s+(\S+)/){
56         $info {user}     = $1;
57         $info {filesize} = $2;
58         $info {filename} = $3;
59
60         push @files, \%info;
61       } # if
62     } # foreach
63   } # foreach
64
65   return @files;
66 } # Bigfiles
67
68 my $lines        = $ENV{LINES} || 24;
69 my $top          = $lines - 2;
70 my $bytes_in_meg = 1048576;
71 my $block_size   = 512;
72 my $size_in_meg  = 1;
73 my %opts;
74
75 my $result = GetOptions (
76   \%opts,
77   usage     => sub { Usage },
78   verbose   => sub { set_verbose },
79   debug     => sub { set_debug },
80   'top=i',
81   'size=i',
82 );
83
84 my @dirs = @ARGV || '.';
85 my $size = $opts {size} ? $opts {size} * $bytes_in_meg / $block_size : 4096;
86
87 # Now do the find
88 verbose "Directory:\t$_"
89
90 foreach (@dirs) {
91   verbose "Size:\t\t$size_in_meg Meg ($size blocks)";
92   verbose "Top:\t\t$top";
93
94   my $head = $top ? "cat" : "head -$top";
95
96   my @files = Bigfiles $size, @dirs;
97 } # for each
98
99 foreach (@files) {
100   my %info = %{$_};
101
102   print "${info {filesize}}\t${info {user}}\t${info {filename}}\n";
103 } # foreach