You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.4 KiB
55 lines
1.4 KiB
#!/usr/bin/python3 |
|
|
|
import argparse |
|
import os |
|
import time |
|
|
|
factor = 0.99 |
|
|
|
def get_sizes(files): |
|
sizes = [] |
|
for file in files: |
|
sizes.append(os.path.getsize(file)) |
|
return sizes |
|
|
|
def human_format(num): |
|
num = float('{:.3g}'.format(num)) |
|
magnitude = 0 |
|
while abs(num) >= 1024: |
|
magnitude += 1 |
|
num /= 1024.0 |
|
return '{}{}'.format('{:.3f}'.format(num).rstrip('0').rstrip('.'), ['', 'K', 'M', 'G', 'T', 'P'][magnitude]) |
|
|
|
def lstrend(files): |
|
avgrates = None |
|
sizes = None |
|
stamp = None |
|
while True: |
|
lastsizes = sizes |
|
laststamp = stamp |
|
sizes = get_sizes(files) |
|
stamp = time.monotonic() |
|
if lastsizes: |
|
diffs = [s-lastsizes[c] for c,s in enumerate(sizes)] |
|
tdelta = stamp-laststamp |
|
rates = [s/tdelta for s in diffs] |
|
if avgrates: |
|
avgrates = [avgrates[c]*factor+r*(1-factor) for c,r in enumerate(rates)] |
|
else: |
|
avgrates = rates |
|
print() |
|
for c,file in enumerate(files): |
|
print("{: <20} {: >10} {: >10}".format(file, human_format(avgrates[c]), human_format(sizes[c]))) |
|
time.sleep(1) |
|
|
|
|
|
def main(): |
|
parser = argparse.ArgumentParser(description='Show trend in file size') |
|
parser.add_argument('files', nargs='+', help='files to list') |
|
|
|
args = parser.parse_args() |
|
|
|
lstrend(args.files) |
|
|
|
if __name__ == "__main__": |
|
main()
|
|
|