¿Como contar el espacio usado en un directorio usando Perl?

Una de esas tantas ociosidades que a la final resultan útiles si lo que se quiere es un programa que funcione igual bajo Windows, Linux o Solaris:


#!/usr/bin/perl
use File::Find;
use Getopt::Long;
use strict;

my $func;
my $unit;
my @dirs;
my %units = (
kb => [ 1024.0, "KB"],
mb => [ 1024.0* 1024.0, "MB"],
gb => [ 1024.0 * 1024.0 * 1024.0, "GB" ]
);

GetOptions("dirs=s" => \@dirs, "unit=s" => \$unit);
die "Define the directories to measure" if (scalar(@dirs) == 0);
$unit = "gb" if not defined $unit;
$unit = "gb" if not defined $units{$unit};

{
my $tsize = 0;
$func = sub {
my (
$dev,
$ino,
$mode,
$nlink,
$uid,
$gid,
$rdev,
$size,
$atime,
$mtime,
$ctime,
$blksize,
$blocks) = stat($File::Find::name);
if ( -f ($File::Find::name)) {
$tsize += $size;
}
return $tsize;
}
}

printf "Scanning directories: %s\n", join(',', @dirs);
foreach my $dir (@dirs) {
find({ wanted => $func, follow => 0 }, $dir);
}

printf "Total size of all combined directories: %.2f %s\n",
(&$func) / $units{$unit}[0], $units{$unit}[1];

La salida de ejemplo seria la siguiente:


auyan:~/src/perl/blog josevnz$ ./du.pl -dir /Users/josevnz -dir /tmp -unit pp
Scanning directories: /Users/josevnz,/tmp
Total size of all combined directories: 31.05 GB

Una belleza por lo simple 😀

Blogalaxia.com:du, perl
Technorati.com:du, perl