http://qs1969.pair.com?node_id=168978


in reply to Using stat() to get the total size of files in a folder

Referring to The UNIX File System page, a directory is defined as following:

A directory is actually implemented as a file that has one line for each item contained within the directory. Each line in a directory file contains only the name of the item, and a numerical reference to the location of the item. The reference is called an i-number, and is an index to a table known as the i-list. The i-list is a complete list of all the storage space available to the file system.

This is exactly the reason for your confusion:

it returns 4096, but the total size of the files in that directory are 30981 bytes

The 4096 number you get is the size of that special directory 'file' that only lists directory items names and their respective i-numbers.

I believe using 'du -k' command should get you what you want. Here's an example:
my %stats = map {m/(\d+)[\t\s]+(.*)/; $2 => $1} `du -k`; for (keys %stats) { print "$_ = $stats{$_}\n"; }
Which gives this output (in my 'test' directory):
./.ssh = 5 ./temp = 273 . = 280
Tell me if this was of any use to you ;-)

_____________________
$"=q;grep;;$,=q"grep";for(`find . -name ".saves*~"`){s;$/;;;/(.*-(\d+) +-.*)$/; $_=["ps -e -o pid | "," $2 | "," -v "," "];`@$_`?{print"+ $1"}:{print" +- $1"}&&`rm $1`; print$\;}