2009/3/4 Lauri Nikkinen <lauri.nikki...@iki.fi>:
> Ok, thanks, I wrote this based on your suggestions, and it seems to do what
> I want. One further question, if you don't mind, how to format this so that
> it prints sizes in megabytes, not in bits?


I tend to use this for kilobytes
sprintf("%.2f Kb",  ($size_in_bytes * 0.0009765625));
and this for megabytes
sprintf("%.2f Mb",  ($size_in_bytes * 9.5367431641e-7));

This rounds to the second decimal place. See perldoc -f sprintf  for details.


> ---code---
> #!/bin/perl
>
> use warnings;
> use strict;
> use File::Find;
>
> my $dir = $ARGV[0];
> die "You must supply a full directory path" unless (-e $dir && -d $dir);
>
> opendir (DIR, $dir) or die "can't opendir $dir: $!";

# This will omit any hidden directories (beginning with a dot) as well
as '..' and '.'
# which save you a couple of lines below. See the example in perldoc -f readdir
my @directories = grep {! /^\./ -d } readdir(DIR)

> my $total_size_of_files_in_dir;

foreach my $dir (@directories) {

         find(\&wanted, $dir);   ### Not sure how that worked as you
called it $directory
         print "The total size of the file in $dir is
 $total_size_of_files_in_dir bytes\n";
> }
>
> sub wanted {
>  if (-f $_) {
>        $total_size_of_files_in_dir += -s;
>  }
> }

I haven't tested the above. It's just my initial thoughts on what you
presented. I hope that helps. Stay tuned as I have some questions of
my own that might help you.
Good luck,
Dp.



> ---code---
>
> -L
>
> 2009/3/4 Dermot <paik...@googlemail.com>
>>
>> 2009/3/4 Lauri Nikkinen <lauri.nikki...@iki.fi>:
>> > Thank you for your post. That is quite there but not enough. See, I have
>> > these directories and files in my C:\Perl\ folder
>> >
>> >  Volume in drive C has no label.
>> >  Volume Serial Number is 248A-0894
>> >
>> >  Directory of C:\Perl
>> >
>> > 04.03.2009  19:18    <DIR>          .
>> > 04.03.2009  19:18    <DIR>          ..
>> > 03.03.2009  21:41    <DIR>          bin
>> > 03.03.2009  21:24    <DIR>          cpan
>> > 03.03.2009  21:40    <DIR>          eg
>> > 03.03.2009  21:42    <DIR>          etc
>> > 03.03.2009  21:41    <DIR>          html
>> > 03.03.2009  21:41    <DIR>          lib
>> > 03.03.2009  21:40    <DIR>          man
>> > 03.03.2009  20:23    <DIR>          OmatPerlit
>> > 03.03.2009  22:09               225 Print_directory_sizes.pl
>> > 01.10.2008  18:00    <DIR>          site
>> > 04.03.2009  19:18                 0 text.txt
>> >                2 File(s)            225 bytes
>> >               11 Dir(s)  28ÿ409ÿ733ÿ120 bytes free
>> >
>> > And I would like to write to script which prints into STDOUT (=cmd
>> > screen)
>> > all the directories in this folder (C:\Perl\) and and their size. So the
>> > out
>> > put should look like this:
>> >
>> > Directory bin: size xxx megabytes
>> > Directory cpan: size xxx megabytes
>> > Directory eg: size xxx megabytes
>> > Directory etc: size xxx megabytes
>> > ...and so on
>> >
>> > Even better, if I could print out all the subdirectories also.
>> >
>> > -L
>> > 2009/3/4 Dermot <paik...@googlemail.com>
>> >>
>> >> 2009/3/3 Wagner, David --- Senior Programmer Analyst --- CFS
>> >> <david.wag...@freight.fedex.com>:
>> >> >> -----Original Message-----
>> >> >> From: lauri.nikki...@gmail.com
>> >> >> [mailto:lauri.nikki...@gmail.com] On Behalf Of Lauri Nikkinen
>> >> >> Sent: Tuesday, March 03, 2009 11:38
>> >> >> To: Perl Beginners
>> >> >> Subject: Printing directory sizes
>> >> >>
>> >> >> Hi,
>> >> >>
>> >> >> I'm trying to print directory sizes using script from
>> >> >>
>> >> >> http://coding.derkeiler.com/Archive/Perl/perl.beginners/2005-0
>> >> >> 8/msg00693.html
>> >> >>
>> >> >> and when I try it from the cmd.exe
>> >> >>
>> >> >> C:\Perl>perl Print_directory_sizes.pl "C:/Temp"
>> >> >>
>> >> >> but I get an error message saying
>> >> >>
>> >> >> use of uninitialized value.... etc.
>> >> >>
>> >> >> Where is the problem? I'm using Win XP.
>> >> >>
>> >> >> ---code---
>> >> >> #!/bin/perl
>> >> >>
>> >> >> use warnings;
>> >> >> use strict;
>> >> >> use File::Find::Rule;
>> >> >>
>> >> >> my $dir = $ARGV[0];
>> >> >> my $size;
>> >> >>
>> >> >> find( sub { -f and ( $size += -s _ ) }, $dir );
>> >> >> ---code---
>> >> >        I took the code and removed the ::Rule and left the other and
>> >> > it
>> >> > ran fine, but did not print anything. So I add a print statement for
>> >> > the
>> >> > $size and it worked without any error msgs,etc and it gve the right
>> >> > values.
>> >> >
>> >> >        What actually happens when you run? Not just the use of uni..
>> >> > but all the output.
>> >>
>> >> I think what Lauri is after, is the accumulated total of all the files
>> >> with a directory, something like this perhaps:
>> >>
>> >> #!/bin/perl
>> >> use strict;
>> >>
>> >> use warnings;
>> >>
>> >> use File::Find;
>> >>
>> >> my $dir = shift;
>> >>
>> >>  die "You must supply a full directory path" unless (-e $dir && -d
>> >> $dir);
>> >> my $total_size_of_files_in_dir;
>> >>
>> >> find(\&wanted, $dir);
>> >>
>> >> print "The total size of the file in $dir is
>> >> $total_size_of_files_in_dir bytes\n";
>> >>
>> >> sub wanted {
>> >>  if (-f $_) {
>> >>        $total_size_of_files_in_dir += -s;
>> >>  }
>> >> }
>> >> A recursive example might be a better tool though.
>> >> Dp.
>>
>>
>> You seem to have changed the spec a bit.
>>
>> Perhaps you want the perl functions: opendir and readdir. The latter
>> has an example of it's use. You can read how to use these function by
>> type the command `perldoc -f readdir`
>>
>> Then you will want to accumilate the total for each file within a
>> directory, use the -s switch as you did/saw in the earlier scripts.
>> perldoc -f -X
>>
>> What I am afraid of doing here is all the work for you because I
>> haven't seen an attempt by you to figure this out for yourself. If I
>> recall from your original post, the first script you got off of the
>> web. If you make an attempt with the functions mentioned above, I'll
>> be glad to give you some guidence :)
>> Dp.
>
>

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to