tar.py
import tarfile from tqdm import tqdm # pip3 install tqdm def decompress(tar_file, path, members=None): """ Extracts `tar_file` and puts the `members` to `path`. If members is None, all members on `tar_file` will be extracted. """ tar = tarfile.open(tar_file, mode="r:gz") if members is None: members = tar.getmembers() # with progress bar # set the progress bar progress = tqdm(members) for member in progress: tar.extract(member, path=path) # set the progress description of the progress bar progress.set_description(f"Extracting {member.name}") # or use this # tar.extractall(members=members, path=path) # close the file tar.close() def compress(tar_file, members): """ Adds files (`members`) to a tar_file and compress it """ # open file for gzip compressed writing tar = tarfile.open(tar_file, mode="w:gz") # with progress bar # set the progress bar progress = tqdm(members) for member in progress: # add file/folder/link to the tar file (compress) tar.add(member) # set the progress description of the progress bar progress.set_description(f"Compressing {member}") # close the file tar.close() # compress("compressed.tar.gz", ["test.txt", "test_folder"]) # decompress("compressed.tar.gz", "extracted") if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="TAR file compression/decompression using GZIP.") parser.add_argument("method", help="What to do, either 'compress' or 'decompress'") parser.add_argument("-t", "--tarfile", help="TAR file to compress/decompress, if it isn't specified for compression, the new TAR file will be named after the first file to compress.") parser.add_argument("-p", "--path", help="The folder to compress into, this is only for decompression. Default is '.' (the current directory)", default="") parser.add_argument("-f", "--files", help="File(s),Folder(s),Link(s) to compress/decompress separated by ','.") args = parser.parse_args() method = args.method tar_file = args.tarfile path = args.path files = args.files # split by ',' to convert into a list files = files.split(",") if isinstance(files, str) else None if method.lower() == "compress": if not files: print("Files to compress not provided, exiting...") exit(1) elif not tar_file: # take the name of the first file tar_file = f"{files[0]}.tar.gz" compress(tar_file, files) elif method.lower() == "decompress": if not tar_file: print("TAR file to decompress is not provided, nothing to do, exiting...") exit(2) decompress(tar_file, path, files) else: print("Method not known, please use 'compress/decompress'.")