#! /usr/bin/env python import os import stat def collect(dir, dir_st, results): total = 1 try: names = os.listdir(dir) except OSError, e: results.append((True, '?', dir)) else: subcollects = [] for name in names: if dir == '.': path = name else: path = os.path.join(dir, name) try: st = os.lstat(path) except OSError: pass else: if stat.S_ISREG(st.st_mode): total += st.st_blocks elif stat.S_ISDIR(st.st_mode): if st.st_dev == dir_st.st_dev: # one file system only subcollects.append((path, st)) for path, st in subcollects: total += collect(path, st, results) results.append((False, total, dir)) return total def display(results): results.sort() for _, info, dir in results: if isinstance(info, (int, long)): info = str(info / (1024*1024/512)) if info == '0': continue print '%6s %s' % (info, dir) if __name__ == '__main__': import sys results = [] for fn in sys.argv[1:] or ['.']: collect(fn, os.stat(fn), results) display(results)