xref: /OK3568_Linux_fs/yocto/poky/scripts/tiny/dirsize.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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