#!/usr/bin/perl -w # package size for gentoo # by bobrik , under GPLv3 my $pkgdir = '/var/db/pkg/'; opendir(PKGDIR, $pkgdir) or die "Can't open package directory: $pkgdir (${!})"; my @categories = (); while ($dir = readdir(PKGDIR)) { if ($dir !~ /^\./) { push(@categories, $dir); } } closedir(PKGDIR); my @packages = (); for $category (@categories) { opendir(CATEGORY, $pkgdir.$category) or die "Can't open ${pkgdir}${category}: $1"; while ($package = readdir(CATEGORY)) { if ($package !~ /^\./) { push(@packages, $category.'/'.$package); } } closedir(CATEGORY); } my %sizes; my %packages; my @result_sizes; my @result_packages; my $i = 0; for $package (@packages) { open(PACKAGE, $pkgdir.$package."/CONTENTS") or (warn "Can't open package fillist for $package (${!})" && next); my @lines = ; close(PACKAGE); my $size = 0; my %md5sums; for $line (@lines) { if ($line =~ /obj (.*) ([a-z0-9]{32}) \d+/) { if (-e $1) { $md5sums{$2} = $1; } } } for $md5 (keys %md5sums) { $size += (-s $md5sums{$md5}); } $result_sizes[$i] = $size; $result_packages[$i] = $package; $sizes{$size} = $i; $packages{$package} = $i; ++$i; warn "Processed $package...\n"; } for (sort {$a <=> $b} @result_sizes) { next if $_ == 0; print (int(${_}/1024/1024*1000)/1000); print " Mb ".$result_packages[$sizes{$_}]."\n"; }