#!/usr/bin/env python3

"""
slacktastic.py - calculate filesystem file slack for different block sizes.
Invoke me thusly:
    find /path/to/tree -xdev -type f -printf "%s\\n" | slacktastic.py 4096
for a calculation using the contents below /path/to/tree with a block size of 4096 bytes.
"""

import sys, functools, math

blksz = None
try:
  blksz = int(sys.argv[1])
except (IndexError,ValueError):
  print(__doc__, file=sys.stderr)
  print('I need a blocksize as the first argument.\n', file=sys.stderr)
  sys.exit(1)

sizes = [int(strsize) for strsize in sys.stdin.read().strip().split('\n')]

sumslack = functools.reduce(lambda sumslack, sz: sumslack + (blksz - (sz % blksz)), sizes, 0)
sumblks = functools.reduce(lambda sumblks, sz: sumblks + (math.ceil(sz / blksz)), sizes, 0)
sumsizes = sum(sizes)

print('{:n} total slack'.format(sumslack))
print('{:n} bytes in files'.format(sumsizes))
print('{0:n} total blocks of {1} bytes'.format(sumblks,blksz))

print('{:.2%} inefficiency'.format( sumslack / (sumblks*blksz) ))
