I have been looking for something like this also. But I tried this on Windows NT 4 SP 6a, and it failed it two ways: 1. getpwuid($uid) failed 2. blocks was always the zero length string. Any suggestions?
I could sum $size instead of $blocks I suppose. Hopefully helpfully yours, Steve -- Steven Tolkin [EMAIL PROTECTED] 617-563-0516 Fidelity Investments 82 Devonshire St. V8D Boston MA 02109 There is nothing so practical as a good theory. Comments are by me, not Fidelity Investments, its subsidiaries or affiliates. > -----Original Message----- > From: Bob Rogers [mailto:[EMAIL PROTECTED]] > Sent: Wednesday, July 24, 2002 11:43 AM > To: [EMAIL PROTECTED] > Subject: Re: [Boston.pm] getting a directory size > > > > [forwarded submission from a non-member address -- rjk] > > > From: Bob Rogers <[EMAIL PROTECTED]> > Date: Wed, 24 Jul 2002 09:10:25 -0400 > Subject: Re: [Boston.pm] getting a directory size > To: Erik Price <[EMAIL PROTECTED]> > CC: "Steve Linberg" <[EMAIL PROTECTED]>, > "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> > > > From: "Steve Linberg" <[EMAIL PROTECTED]> > Date: Wed, 24 Jul 2002 02:03:22 -0400 (EDT) > > On Wed, 24 Jul 2002, Erik Price wrote: > > > Is there a > > command or something that can recursively determine the > amount of disk > > space "contained" in a directory that I can use in this pipe? > > du -s -k dir_name > > (du = "disk usage" on some *nixen) > > But note that not all of them understand "-k"; if they don't, you > probably don't need it. > > Here's a minimal script I wrote (a while ago, it seems) to > do "du" by > user, back when we were having quota problems. Using a pipe would > undoubtedly be more efficient, but this should give you some ideas in > case "du" doesn't do quite what you want (or you're not using Unix). > > -- Bob Rogers > http://rgrjr.dyndns.org/ > > > #!/usr/local/bin/perl > # > # du by user. [doesn't properly account for hard links, > though. -- rgr, > # 15-Jun-98.] > # > # Modification history: > # > # created. -- rgr, 15-Jun-98. > # > > sub user_name { > my $uid = shift; > > $uid_to_user_name{$uid} > || ($uid_to_user_name{$uid} = getpwuid($uid)); > } > > sub du_dir { > my ($dir, $parent_size) = @_; > my ($file, $uid, %size, $subdir, @subdirs); > > opendir(DIR, $dir) || die; > while ($file = readdir(DIR)) { > chomp($file); > next if $file eq '..'; # we don't own our parent directory. > my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, > $atime, $mtime, $ctime, $blksize, $blocks) > = lstat("$dir/$file"); > $size{$uid} += $blocks; > $size{'total'} += $blocks; > # print(join("\t", "$dir/$file", $size, $blocks, > sprintf('%o', $mode)), "\n"); > if ($mode & oct(40000) && $file ne '.') { > push(@subdirs, "$dir/$file"); > } > } > closedir(DIR); > # Recur into subdirectories, in what is effectively a > preorder traversal. > # Do this *after* we are through with DIR, because > directory filehandles are > # globally scoped. -- rgr, 15-Jun-98. > foreach $subdir (@subdirs) { > du_dir($subdir, \%size); > } > # Report results. > $size = sprintf('%d', ($size{'total'}+1)/2); > print("$size\t$dir"); > foreach $uid (sort(keys(%size))) { > $ {$parent_size}{$uid} += $size{$uid}; > unless ($uid eq 'total') { > $size = sprintf('%d', ($size{$uid}+1)/2); > print("\t$size\t", user_name($uid)); > } > } > print "\n"; > } > > push(@ARGV, '.') unless @ARGV; > %size = (); > foreach $arg (@ARGV) { > du_dir($arg, \%size) > if -d $arg; > } >
