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,28 +3,29 @@
## clean-backups.py ## clean-backups.py
Tool to cleanup backup directory with daily, weekly and monthly backups. 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. 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. This tool expects timestamps like this: 20220531 (May 31, 2022), but of course, you can redefine this.
```text ```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 Cleanup old backups
positional arguments: positional arguments:
PATH directory path PATH directory path
optional arguments: optional arguments:
-h, --help show this help message and exit -h, --help show this help message and exit
-d N, --daily N keep N daily backups, default: 7 -d N, --daily N keep N daily backups, default: 7
-w N, --weekly N keep N weekly backups, default: 4 -w N, --weekly N keep N weekly backups, default: 4
-m N, --monthly N keep N monthly backups, default: 3 -m N, --monthly N keep N monthly backups, default: 3
-f, --force suppress remove confirmation -f, --force suppress remove confirmation
-r, --recursive remove files recursively
-t FORMAT, --timestamp-format FORMAT -t FORMAT, --timestamp-format FORMAT
format of timestamp, default: %Y%m%d format of timestamp, default: %Y%m%d
``` ```
For a complete timestamp format description, see the python strftime() documentation: <https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior> For a complete timestamp format description, see the python strftime() documentation: <https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior>

View File

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