change printing options
This commit is contained in:
@@ -6,7 +6,7 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
__version__ = "20251110.01"
|
__version__ = "20251110.02"
|
||||||
|
|
||||||
|
|
||||||
def filter_entries(entries, years=6, months=6, weeks=6, days=6, head=5):
|
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])
|
result.append(last_entry + ["head", str(i + 1), None])
|
||||||
|
|
||||||
start_date = result[-1][1].date()
|
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()
|
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()
|
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()
|
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)
|
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]]
|
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():
|
def get_opts():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description="Filter entries based on file timestamps, or parsed dates for keeping backups for example. Filenames read from stdin. ",
|
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 | xargs echo rm -v ",
|
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__)
|
parser.add_argument("--version", action="version", version=__version__)
|
||||||
|
|
||||||
@@ -85,18 +91,22 @@ def get_opts():
|
|||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"--years", "-y", type=int, default=4, help="Number of annual entries to keep. Default: %(default)s"
|
"--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(
|
parser.add_argument(
|
||||||
"--parse", default=None, help="Parse names, instead of using file timestamps (ex: 'service-%%Y-%%m-%%d.log')"
|
"--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()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.head < 1:
|
if args.head < 1:
|
||||||
parser.error("HEAD must be at least 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():
|
if sys.stdin.isatty():
|
||||||
parser.print_help()
|
parser.print_help()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
@@ -107,6 +117,14 @@ def printable_date(d):
|
|||||||
return d.strftime("%Y-%m-%d %a %H:%M:%S")
|
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():
|
def main():
|
||||||
|
|
||||||
args = get_opts()
|
args = get_opts()
|
||||||
@@ -123,17 +141,21 @@ def main():
|
|||||||
if args.json:
|
if args.json:
|
||||||
print(
|
print(
|
||||||
json.dumps(
|
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,
|
indent=2,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
printable = remove if args.invert else keep
|
if args.keep:
|
||||||
for entry in printable:
|
print_table(keep, args.verbose)
|
||||||
if args.verbose:
|
if args.drop:
|
||||||
print(f"{entry[0]:20s} {printable_date(entry[1])} {entry[2]:5s} {entry[3]}")
|
print_table(remove, args.verbose)
|
||||||
else:
|
if args.stderr:
|
||||||
print(entry[0])
|
print_table(keep, True, file=sys.stderr)
|
||||||
|
print_table(remove, True, file=sys.stderr)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user