#!/usr/bin/env python3 # # Copyright (c) 2011, Intel Corporation. # # SPDX-License-Identifier: GPL-2.0-or-later # # Display details of the root filesystem size, broken up by directory. # Allows for limiting by size to focus on the larger files. # # Author: Darren Hart # import os import sys import stat class Record: def create(path): r = Record(path) s = os.lstat(path) if stat.S_ISDIR(s.st_mode): for p in os.listdir(path): pathname = path + "/" + p ss = os.lstat(pathname) if not stat.S_ISLNK(ss.st_mode): r.records.append(Record.create(pathname)) r.size += r.records[-1].size r.records.sort(reverse=True) else: r.size = os.lstat(path).st_size return r create = staticmethod(create) def __init__(self, path): self.path = path self.size = 0 self.records = [] def __lt__(this, that): if that is None: return False if not isinstance(that, Record): raise TypeError if len(this.records) > 0 and len(that.records) == 0: return False if this.size > that.size: return False return True def show(self, minsize): total = 0 if self.size <= minsize: return 0 print("%10d %s" % (self.size, self.path)) for r in self.records: total += r.show(minsize) if len(self.records) == 0: total = self.size return total def main(): minsize = 0 if len(sys.argv) == 2: minsize = int(sys.argv[1]) rootfs = Record.create(".") total = rootfs.show(minsize) print("Displayed %d/%d bytes (%.2f%%)" % \ (total, rootfs.size, 100 * float(total) / rootfs.size)) if __name__ == "__main__": main()