added todo
[feisty_meow.git] / scripts / files / summing_dir.pl
1 #!/usr/bin/perl
2
3 ###############################################################################
4 #                                                                             #
5 #  Name   : summing_dir                                                       #
6 #  Author : Chris Koeritz                                                     #
7 #  Rights : Copyright (C) 2000-$now by Author                                 #
8 #                                                                             #
9 #  Purpose:                                                                   #
10 #                                                                             #
11 #    Provides a somewhat stylized directory lister.                           #
12 #                                                                             #
13 ###############################################################################
14 #  This program is free software; you can redistribute it and/or modify it    #
15 #  under the terms of the GNU General Public License as published by the Free #
16 #  Software Foundation; either version 2 of the License or (at your option)   #
17 #  any later version.  See: "http://www.gruntose.com/Info/GNU/GPL.html" for a #
18 #  version of the License.  Please send any updates to "fred@gruntose.com".   #
19 ###############################################################################
20
21 require "filename_helper.pl";
22
23 use Env qw($TMP $color_add $ls_dot_add $TERM);
24
25 local($chewed_line) = "";
26 local(@arg_list);
27 local($print_list) = "";
28
29 # if there were no parameters, we make the default listing for the current
30 # directory.
31 if ($#ARGV < 0) {
32   $print_list = "Current Directory";
33   @arg_list = ( "." );
34 } else {
35   local(@munged_list) = &patch_name_for_pc(&remove_trailing_slashes(@ARGV));
36   $print_list = "@munged_list";
37   @arg_list = &glob_list(@ARGV);
38 }
39
40 # add parameters to our chewed_line, but skip items if they are flags we don't
41 # implement.
42 foreach $dir (@arg_list) {
43 #hmmm: fix this by using a pattern, to exclude cmd line parms, but recognize some of them, like recursive?  hmmm.
44   if ($dir eq "-al") { next; }  # skip ls directives.
45   if ($dir eq "-l") { next; }  # skip ls directives.
46   $chewed_line = $chewed_line . " \"$dir\"";
47 }
48
49 if ("$chewed_line" eq "") {
50   print "No files matched that path specification.\n";
51   exit 0;
52 }
53
54 # show the header, now that we know there's something to print.
55 print "[" . $print_list . "]\n\n";
56
57 local($temp_file)=`mktemp "$TMP/zz_frdsumdir.XXXXXX"`;
58 chop($temp_file);
59
60 # drop the main payload, the list of directory info, but also save that
61 # info to a file for analysis.
62 system("ls -HhlF $ls_dot_add $color_add $chewed_line");
63 system("ls -HhlF $ls_dot_add $color_add $chewed_line > $temp_file");
64   # the color_add variable, if defined, will have flags for setting the
65   # directory listing color scheme.
66
67 local($lengths) = 0;
68
69 # open the file and process the lines to get file lengths.
70 open(DIRLIST, "<$temp_file");
71 # we only want to match ls -al style output lines, and only want to keep the size.
72 $pattern="^[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +([0-9.]+[KMG]?).*\$";
73 foreach $file_line (<DIRLIST>) {
74   if ($file_line =~ /$pattern/) {
75     (local $munged = $file_line) =~ s/$pattern/\1/;
76     if ($munged =~ /K$/) {
77       chop $munged;
78       $munged *= 1024.0;
79       #print "K munged is now $munged\n";
80     }
81     if ($munged =~ /M$/) {
82       chop $munged;
83       $munged *= 1024.0 * 1024.0;
84       #print "M munged is now $munged\n";
85     }
86     if ($munged =~ /G$/) {
87       chop $munged;
88       $munged *= 1024.0 * 1024.0 * 1024.0;
89       #print "G munged is now $munged\n";
90     }
91     $lengths += $munged;
92   }
93 }
94 close(DIRLIST);
95 unlink($temp_file);  # clean up.
96
97 local($total)=int($lengths);
98 local($kbytes)=int($total / 102.4) / 10;
99 local($mbytes)=int($kbytes / 102.4) / 10;
100 local($gbytes)=int($mbytes / 102.4) / 10;
101
102 print "\n";
103 # print a fancy listing showing bytes at least, but only showing mb and gb if appropriate.
104 print "These files occupy $total bytes ($kbytes KB";
105 if ($mbytes ne 0) {
106  print " / $mbytes MB";
107 }
108 if ($gbytes ne 0) {
109  print " / $gbytes GB";
110 }
111 print ").\n";
112
113 print "Overall Drive Usage (megs):\n";
114
115 system("df -m $chewed_line >$temp_file");
116
117 # now eat the file again, but this time to get drive space info.
118 open(DIRLIST, "<$temp_file");
119 local($space_info) = "";
120 local($did_title) = 0;  # true if we have printed the title by now.
121 foreach $file_line (<DIRLIST>) {
122   ($space_info = $file_line) =~ s/[^ ]* *([^ ]*) *([^ ]*) *([^ ]*) *([^ ]*) *.*$/\1     \2      \3      \4/;
123   if (!$did_title) {
124     # if the title hasn't been printed yet, we take some of the info out of
125     # the line and use it for the right sense of the last column.
126     print "Total        Used    Free    ";
127     $space_info =~ s/[^ ]*      *[^     ]*      *[^     ]*      *([^    ]*)/\1/;
128     print "$space_info";
129     $did_title = 1;
130   } else {
131   }
132 }
133 close(DIRLIST);
134 unlink($temp_file);  # clean up.
135
136 print "$space_info\n";
137
138 exit 0;
139