#!/usr/bin/python3 import os import subprocess import sys import re import click def du(paths): # Just using coreutils du, to have deduping, and the correct size result = subprocess.check_output(["du", "-sc", "--block-size=1", *paths]) total_line = result.splitlines()[-1] total_bytes, total_check = total_line.split(b"\t") assert total_check == b"total" return int(total_bytes) def interpret_prefixes(number, si=False): # prefix as the "K" in "KB" multiplier = 1000 if si else 1024 if m := re.match(r"^(?i:(\d+)([kmg])?)", number): number, prefix = m.groups() else: raise ValueError("Can't interpret size") number = int(number) if prefix is not None: prefix = prefix.lower() exponent = { None: 0, "k": 1, "m": 2, "g": 3, "t": 4, } return number * multiplier ** exponent[prefix] @click.command() @click.argument("threshold") @click.argument("paths", nargs=-1) def larger_than(threshold, paths): """Check if disk usage of PATHS is larger than THRESHOLD""" threshold = interpret_prefixes(threshold) if du(paths) > threshold: sys.exit(0) else: sys.exit(1) if __name__ == "__main__": larger_than()