Add recursive deletion support

This commit is contained in:
Сергей Морозов 2022-07-13 12:00:34 +03:00
parent 6225af0308
commit e20dcce913
2 changed files with 28 additions and 17 deletions

View File

@ -3,14 +3,14 @@
## clean-backups.py
Tool to cleanup backup directory with daily, weekly and monthly backups.
This tool removes **everything** in the specified directory (not recursively) except files, containing timestamps in the filename that can identified by this tool as fresh backups.
This tool removes **everything** in the specified directory (not recursively by default) except files, containing timestamps in the filename that can identified by this tool as fresh backups.
By default, this tool keeps last 7 daily backups, 4 weekly backups (4 last monday backups) and 3 monthly backups (1st day of last 3 months). You can redefine this by command line parameters.
This tool expects timestamps like this: 20220531 (May 31, 2022), but of course, you can redefine this.
```text
usage: clean-backups.py [-h] [-d N] [-w N] [-m N] [-f] PATH
usage: clean-backups.py [-h] [-d N] [-w N] [-m N] [-f] [-r] [-t FORMAT] PATH
Cleanup old backups
@ -23,6 +23,7 @@ optional arguments:
-w N, --weekly N keep N weekly backups, default: 4
-m N, --monthly N keep N monthly backups, default: 3
-f, --force suppress remove confirmation
-r, --recursive remove files recursively
-t FORMAT, --timestamp-format FORMAT
format of timestamp, default: %Y%m%d
```

View File

@ -176,6 +176,12 @@ parser.add_argument(
action="store_true",
help="suppress remove confirmation"
)
# force removal
parser.add_argument(
"-r", "--recursive",
action="store_true",
help="remove files recursively"
)
# timestamp format
parser.add_argument(
"-t",
@ -190,22 +196,26 @@ args = parser.parse_args()
daily = args.daily
weekly = args.weekly
monthly = args.monthly
recursive = args.recursive
force = args.force
directory = args.path[0]
timestamp_format = args.timestamp_format
#
# File processing
#
# Create BackupFile object with retention settings
files = BackupFile(
retention_daily=daily,
retention_weekly=weekly,
retention_monthly=monthly,
dateformat=timestamp_format
)
# Generate file list with full paths
paths = [
os.path.join(directory, f) for f in os.listdir(directory)
if os.path.isfile(os.path.join(directory, f))
]
for path in paths:
f = files.new_file(path)
# Walk through subdirectory tree
for root, dirs, filenames in os.walk(directory):
for filename in filenames:
f = files.new_file(os.path.join(root, filename))
f.remove_if_needed(force_remove=force)
if not recursive:
break