From 39f789e7cacb05283de4f44f3ae34e70b1c11a27 Mon Sep 17 00:00:00 2001 From: q Date: Mon, 10 Nov 2025 13:59:01 +0200 Subject: [PATCH] change printing options --- files/daterake | 60 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/files/daterake b/files/daterake index 61343f6..798a766 100755 --- a/files/daterake +++ b/files/daterake @@ -6,7 +6,7 @@ import os import sys from datetime import datetime -__version__ = "20251110.01" +__version__ = "20251110.02" def filter_entries(entries, years=6, months=6, weeks=6, days=6, head=5): @@ -48,14 +48,20 @@ def filter_entries(entries, years=6, months=6, weeks=6, days=6, head=5): result.append(last_entry + ["head", str(i + 1), None]) start_date = result[-1][1].date() - result.extend([entry for i, entry in enumerate(reduce(entries, date2day, start_date, "day", days*1)) if i < days]) + result.extend([entry for i, entry in enumerate(reduce(entries, date2day, start_date, "day", days * 1)) if i < days]) start_date = result[-1][1].date() - result.extend([entry for i, entry in enumerate(reduce(entries, date2week, start_date, "week", weeks*7)) if i < weeks]) + result.extend( + [entry for i, entry in enumerate(reduce(entries, date2week, start_date, "week", weeks * 7)) if i < weeks] + ) start_date = result[-1][1].date() - result.extend([entry for i, entry in enumerate(reduce(entries, date2month, start_date, "month", months*31)) if i < months]) + result.extend( + [entry for i, entry in enumerate(reduce(entries, date2month, start_date, "month", months * 31)) if i < months] + ) start_date = result[-1][1].date() - result.extend([entry for i, entry in enumerate(reduce(entries, date2year, start_date, "year",years*366)) if i < years]) - + result.extend( + [entry for i, entry in enumerate(reduce(entries, date2year, start_date, "year", years * 366)) if i < years] + ) + result.sort(key=lambda x: x[1], reverse=True) filtered = [f + ["removed", "", None] for f in original_entries if f[0] not in [r[0] for r in result]] @@ -65,8 +71,8 @@ def filter_entries(entries, years=6, months=6, weeks=6, days=6, head=5): def get_opts(): parser = argparse.ArgumentParser( - description="Filter entries based on file timestamps, or parsed dates for keeping backups for example. Filenames read from stdin. ", - epilog="Example usage (watch out for actual deletion): # ls | grep ^backup- | daterake -n 5 --drop | xargs echo rm -v ", + description="Filter entries based on file timestamps, or parsed dates for keeping backups for example. Filenames read from stdin. Note: you must use any of --keep, --drop, --stderr, --json. ", + epilog="Example usage (watch out for actual deletion): # ls | grep ^backup- | daterake -n 5 --drop -s | xargs echo rm -f ", ) parser.add_argument("--version", action="version", version=__version__) @@ -85,18 +91,22 @@ def get_opts(): parser.add_argument( "--years", "-y", type=int, default=4, help="Number of annual entries to keep. Default: %(default)s" ) - parser.add_argument("--json", default=False, action="store_true", help="Print output as JSON") - parser.add_argument("--verbose", "-v", default=False, action="store_true", help="Print output as verbose table") - parser.add_argument("--invert", "--drop", default=False, action="store_true", help="Print the names to remove") - parser.add_argument( "--parse", default=None, help="Parse names, instead of using file timestamps (ex: 'service-%%Y-%%m-%%d.log')" ) + parser.add_argument("--json", default=False, action="store_true", help="Print output as JSON") + parser.add_argument("--verbose", "-v", default=False, action="store_true", help="Print output as verbose table") + parser.add_argument("--stderr", "-s", default=False, action="store_true", help="Print full output in stderr") + parser.add_argument("--drop", "--invert", default=False, action="store_true", help="Print the names to drop") + parser.add_argument("--keep", default=False, action="store_true", help="Print the names to keep") args = parser.parse_args() if args.head < 1: parser.error("HEAD must be at least 1") + if not any((args.keep, args.drop, args.stderr, args.json)): + parser.error("Not using any of keep, drop, json or stderr will not print out anything.") + if sys.stdin.isatty(): parser.print_help() sys.exit(0) @@ -107,6 +117,14 @@ def printable_date(d): return d.strftime("%Y-%m-%d %a %H:%M:%S") +def print_table(printable, verbose, file=sys.stdout): + for entry in printable: + if verbose: + print(f"{entry[0]:20s} {printable_date(entry[1])} {entry[2]:5s} {entry[3]}", file=file) + else: + print(entry[0], file=file) + + def main(): args = get_opts() @@ -123,17 +141,21 @@ def main(): if args.json: print( json.dumps( - [{"name": f[0], "date": printable_date(f[1]), "match": f[2], "match-id": f[3], "age":f[4]} for f in keep + remove], + [ + {"name": f[0], "date": printable_date(f[1]), "match": f[2], "match-id": f[3], "age": f[4]} + for f in keep + remove + ], indent=2, ) ) else: - printable = remove if args.invert else keep - for entry in printable: - if args.verbose: - print(f"{entry[0]:20s} {printable_date(entry[1])} {entry[2]:5s} {entry[3]}") - else: - print(entry[0]) + if args.keep: + print_table(keep, args.verbose) + if args.drop: + print_table(remove, args.verbose) + if args.stderr: + print_table(keep, True, file=sys.stderr) + print_table(remove, True, file=sys.stderr) if __name__ == "__main__":