tags:

views:

82

answers:

3

My hosting company does not provide an interface for me to see which folders are consuming the most amount of space so what I'm looking for is something that will show me the size of each folder within my main folder recursively, I don't know of anything on the Internet, and did a few searches however I came up with no results. This is a LAMP server with a CGI-Bin so most any PHP script should work or anything that will work in the CGI-Bin.

Something implementing graphs (GD/ImageMagick) would be best but not required.
It appears that my host supports Perl only in the CGI-BIN, but I am going to call and verify that.

+3  A: 

Strange, I came up on Google with many relevant results and this one is probably the most complete.

The function "getDirectorySize" will ignore link/shorcuts to files/directory. The function "sizeFormat" will suffix the size with bytes,KB,MB or GB accordingly.

Code

function getDirectorySize($path)
{
  $totalsize = 0;
  $totalcount = 0;
  $dircount = 0;
  if ($handle = opendir ($path))
  {
    while (false !== ($file = readdir($handle)))
    {
      $nextpath = $path . '/' . $file;
      if ($file != '.' && $file != '..' && !is_link ($nextpath))
      {
        if (is_dir ($nextpath))
        {
          $dircount++;
          $result = getDirectorySize($nextpath);
          $totalsize += $result['size'];
          $totalcount += $result['count'];
          $dircount += $result['dircount'];
        }
        elseif (is_file ($nextpath))
        {
          $totalsize += filesize ($nextpath);
          $totalcount++;
        }
      }
    }
  }
  closedir ($handle);
  $total['size'] = $totalsize;
  $total['count'] = $totalcount;
  $total['dircount'] = $dircount;
  return $total;
}

function sizeFormat($size)
{
    if($size<1024)
    {
        return $size." bytes";
    }
    else if($size<(1024*1024))
    {
        $size=round($size/1024,1);
        return $size." KB";
    }
    else if($size<(1024*1024*1024))
    {
        $size=round($size/(1024*1024),1);
        return $size." MB";
    }
    else
    {
        $size=round($size/(1024*1024*1024),1);
        return $size." GB";
    }

}

Usage

$path="/httpd/html/pradeep/";
$ar=getDirectorySize($path);

echo "<h4>Details for the path : $path</h4>";
echo "Total size : ".sizeFormat($ar['size'])."<br>";
echo "No. of files : ".$ar['count']."<br>";
echo "No. of directories : ".$ar['dircount']."<br>";

Output

Details for the path : /httpd/html/pradeep/
Total size : 2.9 MB
No. of files : 196
No. of directories : 20
lubos hasko
A: 

I don't know how I didn't find it but I spent almost an hour looking, and even started to write something.

Unkwntech
+1  A: 

If you have shell access you can run the command

$ du -h

or perhaps use this, if PHP is configured to allow execution:

<?php $d = escapeshellcmd(dirname(__FILE__)); echo nl2br(`du -h $d`) ?>
John Douthat