Sometimes, especially when disk space is low (or when system backups grow unreasonably large), it's nice to know exactly how much space the biggest packages occupy. Obviously, OpenOffice is never above suspicion, but certain others can take up way more space than you would think.
I wrote a little script to print the size of all packages installed on the system. It uses the CONTENTS
file for every installed ebuild to check the size of the files which belong to a package and give a sorted listing of packages by size.
#!/usr/bin/env python
#
# Author: Martin Matusiak <numerodix@gmail.com>
# Licensed under the GNU Public License, version 2.
#
# revision 1 - bugfix for paludis symlink in pkgdb
pkgdb = "/var/db/pkg"
import os, string, stat
from operator import itemgetter
sizes = {}
cats = os.listdir(pkgdb)
for c in cats:
cpath = os.path.join(pkgdb, c)
if os.path.isdir(cpath):
cat = os.listdir(cpath)
for p in cat:
size = 0
cont = os.path.join(pkgdb, c, p, "CONTENTS")
fd = open(cont, 'r')
strings = fd.readlines()
for s in strings:
line = string.split(s, " ")
if line[0] == "obj" and os.path.exists(line[1]):
size += os.path.getsize(line[1])
fd.close()
sizes[os.path.join(c, p)] = size
pkglist = sorted(sizes.items(), key=itemgetter(1))
for i in pkglist:
(size, pkg) = ( str(i[1]), i[0] )
print string.rjust(size, 11), " ", pkg
The output looks like this:
0 virtual/x11-7.0-r2 66 kde-base/kde-env-3-r4 393 kde-base/kdebase-pam-6 889 sys-apps/coldplug-20040920-r1 ... 94217 net-ftp/ftp-0.17-r6 94642 kde-base/kcminit-3.5.3 95629 sys-process/psmisc-22.2 95931 sys-apps/ivman-0.6.12 97358 app-admin/gnomesu-0.3.1 ... 122593614 dev-java/sun-jdk-1.5.0.08 132864794 dev-lang/ghc-6.4.2 145477793 app-text/tetex-2.0.2-r8 221943002 sys-kernel/gentoo-sources-2.6.17-r7 340336824 app-office/openoffice-bin-2.0.3
Unsurprisingly, OpenOffice claims victory, but this is a small reminder about how big kernel sources are. Tetex and GHC aren't minimalistic either.
UPDATE: Paludis bug fixed.
Very usefull script. unemerged few HUGE packages (games are big ;-)
I have a bug (?!). paludis makes a symlink in /var/db/pkg (like this: world -> /var/lib/portage/world) and pkgsize.py fails with:
File "./pkgsize.py", line 16, in ?
cat = os.listdir(os.path.join(pkgdb, c))
OSError: [Errno 20] Not a directory: '/var/db/pkg/world'
That was unexpected, but I fixed the bug now.