#!/usr/bin/python3 from pathlib import Path import json import tarfile import datetime from functools import partial import time def tar_filter(filters, tarinfo): if any([filter_name in tarinfo.name for filter_name in filters]): print(f"\tFiltering: {tarinfo.name}") return None return tarinfo def local_backup(output_dir: Path, backup_name: str, inputs: list, ignore_patterns: list): current_time = datetime.datetime.now().isoformat() start = time.time() archive_path = output_dir / f"{backup_name}-{current_time}.tar.gz" filter_function = partial(tar_filter, ignore_patterns) print(archive_path) with tarfile.open(archive_path, "w:xz") as f: for file_or_dir in inputs: file_or_dir = Path(file_or_dir).expanduser().resolve() print(f"Compressing: {file_or_dir}") f.add(file_or_dir, filter=filter_function) print(f"Total time: {(time.time() - start) / 60}mins") def backup_all(): config_dir = Path(__file__).parent / "configs" config_files = sorted(config_dir.glob("*")) print(config_files) for file in config_files: text = file.read_text() config = json.loads(text) output_dir = Path(config["outputDir"]).expanduser().resolve() inputs = config["inputs"] ignore_patterns = config["ignorePatterns"] backup_name = file.stem local_backup(output_dir, backup_name, inputs, ignore_patterns) if __name__ == "__main__": backup_all()