diff --git a/scripts/tiny/dirsize.py b/scripts/tiny/dirsize.py
new file mode 100755
index 0000000..40ff4ab
--- /dev/null
+++ b/scripts/tiny/dirsize.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2011, Intel Corporation.
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# 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 <dvhart@linux.intel.com>
+#
+
+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 __cmp__(this, that):
+        if that is None:
+            return 1
+        if not isinstance(that, Record):
+            raise TypeError
+        if len(this.records) > 0 and len(that.records) == 0:
+            return -1
+        if len(this.records) == 0 and len(that.records) > 0:
+            return 1
+        if this.size < that.size:
+            return -1
+        if this.size > that.size:
+            return 1
+        return 0
+
+    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()
