76 lines
1.7 KiB
Python
Executable File
76 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import pwd
|
|
from argparse import ArgumentParser
|
|
|
|
MINSIZE = 0
|
|
|
|
|
|
def setup_options():
|
|
parser = ArgumentParser(description="List file usage")
|
|
parser.add_argument("startpath", action="append", nargs="+")
|
|
|
|
options = parser.parse_args()
|
|
return options
|
|
|
|
|
|
def add_recurse(db, options, start):
|
|
for path, dirs, files in os.walk(start, followlinks=False):
|
|
files = clean_syms(files, path)
|
|
for f in files:
|
|
filename = os.path.join(path, f)
|
|
stats = os.stat(filename)
|
|
owner = stats.st_uid
|
|
size = stats.st_size
|
|
if not owner in db:
|
|
db[owner] = 0
|
|
db[owner] += size
|
|
return db
|
|
|
|
|
|
def clean_syms(files, path):
|
|
nonsyms = []
|
|
for f in files:
|
|
if not os.path.islink(os.path.join(path, f)):
|
|
nonsyms.append(f)
|
|
return nonsyms
|
|
|
|
|
|
def print_db(db):
|
|
namedb = dict()
|
|
for u in db:
|
|
try:
|
|
namedb[pwd.getpwuid(u).pw_name] = humanize_size(db[u])
|
|
except:
|
|
namedb[str(u)] = humanize_size(db[u])
|
|
names = list(namedb.keys())
|
|
names.sort()
|
|
for n in names:
|
|
print(n + ": " + namedb[n])
|
|
|
|
|
|
def humanize_size(size, precision=1):
|
|
if size == None:
|
|
return "nan"
|
|
suffixes = ["B", "KB", "MB", "GB", "TB"]
|
|
suffixIndex = 0
|
|
defPrecision = 0
|
|
while size > 1024:
|
|
suffixIndex += 1 # increment the index of the suffix
|
|
size = size / 1024.0 # apply the division
|
|
defPrecision = precision
|
|
return "%.*f%s" % (defPrecision, size, suffixes[suffixIndex])
|
|
|
|
|
|
def main():
|
|
options = setup_options()
|
|
db = dict()
|
|
for f in options.startpath[0]:
|
|
db = add_recurse(db, options, f)
|
|
print_db(db)
|
|
sys.exit(0)
|
|
|
|
|
|
main()
|