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/