1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright (c) 2011, Intel Corporation. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun# Display details of the root filesystem size, broken up by directory. 8*4882a593Smuzhiyun# Allows for limiting by size to focus on the larger files. 9*4882a593Smuzhiyun# 10*4882a593Smuzhiyun# Author: Darren Hart <dvhart@linux.intel.com> 11*4882a593Smuzhiyun# 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunimport os 14*4882a593Smuzhiyunimport sys 15*4882a593Smuzhiyunimport stat 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunclass Record: 18*4882a593Smuzhiyun def create(path): 19*4882a593Smuzhiyun r = Record(path) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun s = os.lstat(path) 22*4882a593Smuzhiyun if stat.S_ISDIR(s.st_mode): 23*4882a593Smuzhiyun for p in os.listdir(path): 24*4882a593Smuzhiyun pathname = path + "/" + p 25*4882a593Smuzhiyun ss = os.lstat(pathname) 26*4882a593Smuzhiyun if not stat.S_ISLNK(ss.st_mode): 27*4882a593Smuzhiyun r.records.append(Record.create(pathname)) 28*4882a593Smuzhiyun r.size += r.records[-1].size 29*4882a593Smuzhiyun r.records.sort(reverse=True) 30*4882a593Smuzhiyun else: 31*4882a593Smuzhiyun r.size = os.lstat(path).st_size 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun return r 34*4882a593Smuzhiyun create = staticmethod(create) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun def __init__(self, path): 37*4882a593Smuzhiyun self.path = path 38*4882a593Smuzhiyun self.size = 0 39*4882a593Smuzhiyun self.records = [] 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun def __lt__(this, that): 42*4882a593Smuzhiyun if that is None: 43*4882a593Smuzhiyun return False 44*4882a593Smuzhiyun if not isinstance(that, Record): 45*4882a593Smuzhiyun raise TypeError 46*4882a593Smuzhiyun if len(this.records) > 0 and len(that.records) == 0: 47*4882a593Smuzhiyun return False 48*4882a593Smuzhiyun if this.size > that.size: 49*4882a593Smuzhiyun return False 50*4882a593Smuzhiyun return True 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun def show(self, minsize): 53*4882a593Smuzhiyun total = 0 54*4882a593Smuzhiyun if self.size <= minsize: 55*4882a593Smuzhiyun return 0 56*4882a593Smuzhiyun print("%10d %s" % (self.size, self.path)) 57*4882a593Smuzhiyun for r in self.records: 58*4882a593Smuzhiyun total += r.show(minsize) 59*4882a593Smuzhiyun if len(self.records) == 0: 60*4882a593Smuzhiyun total = self.size 61*4882a593Smuzhiyun return total 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun 64*4882a593Smuzhiyundef main(): 65*4882a593Smuzhiyun minsize = 0 66*4882a593Smuzhiyun if len(sys.argv) == 2: 67*4882a593Smuzhiyun minsize = int(sys.argv[1]) 68*4882a593Smuzhiyun rootfs = Record.create(".") 69*4882a593Smuzhiyun total = rootfs.show(minsize) 70*4882a593Smuzhiyun print("Displayed %d/%d bytes (%.2f%%)" % \ 71*4882a593Smuzhiyun (total, rootfs.size, 100 * float(total) / rootfs.size)) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun 74*4882a593Smuzhiyunif __name__ == "__main__": 75*4882a593Smuzhiyun main() 76