17db96d56Sopenharmony_ci#! /usr/bin/env python3 27db96d56Sopenharmony_ci# Format du output in a tree shape 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ciimport os, sys, errno 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_cidef main(): 77db96d56Sopenharmony_ci total, d = None, {} 87db96d56Sopenharmony_ci with os.popen('du ' + ' '.join(sys.argv[1:])) as p: 97db96d56Sopenharmony_ci for line in p: 107db96d56Sopenharmony_ci i = 0 117db96d56Sopenharmony_ci while line[i] in '0123456789': i = i+1 127db96d56Sopenharmony_ci size = eval(line[:i]) 137db96d56Sopenharmony_ci while line[i] in ' \t': i = i+1 147db96d56Sopenharmony_ci filename = line[i:-1] 157db96d56Sopenharmony_ci comps = filename.split('/') 167db96d56Sopenharmony_ci if comps[0] == '': comps[0] = '/' 177db96d56Sopenharmony_ci if comps[len(comps)-1] == '': del comps[len(comps)-1] 187db96d56Sopenharmony_ci total, d = store(size, comps, total, d) 197db96d56Sopenharmony_ci try: 207db96d56Sopenharmony_ci display(total, d) 217db96d56Sopenharmony_ci except IOError as e: 227db96d56Sopenharmony_ci if e.errno != errno.EPIPE: 237db96d56Sopenharmony_ci raise 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_cidef store(size, comps, total, d): 267db96d56Sopenharmony_ci if comps == []: 277db96d56Sopenharmony_ci return size, d 287db96d56Sopenharmony_ci if comps[0] not in d: 297db96d56Sopenharmony_ci d[comps[0]] = None, {} 307db96d56Sopenharmony_ci t1, d1 = d[comps[0]] 317db96d56Sopenharmony_ci d[comps[0]] = store(size, comps[1:], t1, d1) 327db96d56Sopenharmony_ci return total, d 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_cidef display(total, d): 357db96d56Sopenharmony_ci show(total, d, '') 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_cidef show(total, d, prefix): 387db96d56Sopenharmony_ci if not d: return 397db96d56Sopenharmony_ci list = [] 407db96d56Sopenharmony_ci sum = 0 417db96d56Sopenharmony_ci for key in d.keys(): 427db96d56Sopenharmony_ci tsub, dsub = d[key] 437db96d56Sopenharmony_ci list.append((tsub, key)) 447db96d56Sopenharmony_ci if tsub is not None: sum = sum + tsub 457db96d56Sopenharmony_ci## if sum < total: 467db96d56Sopenharmony_ci## list.append((total - sum, os.curdir)) 477db96d56Sopenharmony_ci list.sort() 487db96d56Sopenharmony_ci list.reverse() 497db96d56Sopenharmony_ci width = len(repr(list[0][0])) 507db96d56Sopenharmony_ci for tsub, key in list: 517db96d56Sopenharmony_ci if tsub is None: 527db96d56Sopenharmony_ci psub = prefix 537db96d56Sopenharmony_ci else: 547db96d56Sopenharmony_ci print(prefix + repr(tsub).rjust(width) + ' ' + key) 557db96d56Sopenharmony_ci psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1) 567db96d56Sopenharmony_ci if key in d: 577db96d56Sopenharmony_ci show(tsub, d[key][1], psub) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ciif __name__ == '__main__': 607db96d56Sopenharmony_ci main() 61