作成したのでメモ書きします。
collect_dir_dict_list
にフルパスで指定したディレクトリ(複数設定可)を、任意の場所に集めて圧縮するスクリプトです。
import os
import datetime
import tarfile
import shutil
from pathlib import Path
from distutils.dir_util import copy_tree
def dirs_backup_exec(collect_dir_dict_list: dict,
save_dir_path: str,
tar_file_name: str):
"""ディレクトリバックアップ関数"""
# 作業用ディレクトリ名を設定(collect_dirs_yyyymmdd_hhmm)
tmp_dir_name = f"{tar_file_name}_{get_current_time()}"
# 作業場所のディクレクトリのパスを設定
save_dir_path = Path(save_dir_path)
# 収集したファイルを格納するディレクトリのパスを設定
tmp_path = Path(save_dir_path, tmp_dir_name)
# 作業ディレクトリの作成(既に作成されている場合は上書き作成する)
os.makedirs(tmp_path, exist_ok=True)
# キーで指定したディレクトリに値で指定したパスの中身をコピーする
for target_dir_name, target_dir_path in zip(collect_dir_dict_list.keys(),
collect_dir_dict_list.values()):
# ファイルを格納するディレクトリを作成
tmp_save_path = Path(tmp_path, target_dir_name)
os.makedirs(tmp_save_path, exist_ok=True)
# 作成したファイルディレクトリに収集したファイルを格納する
copy_tree(str(target_dir_path), str(tmp_save_path))
# 収集が完了したログをtar.gzで固める
tar_gz_file_name = f"{tmp_dir_name}.tar.gz"
# tar.gzの配置先と保存ファイル名を指定する
with tarfile.open(Path(save_dir_path, tar_gz_file_name),
mode='w:gz')as archive:
# tar.gz化するディレクトリのある場所まで移動
os.chdir(save_dir_path)
# tar.gz化するディレクトリ名を指定する
archive.add(tmp_dir_name)
archive.close()
# 作業用に作成したディレクトリを削除
shutil.rmtree(tmp_path)
def get_current_time():
""" logファイル名に使用する現在の日時を返す """
t_delta = datetime.timedelta(hours=9)
JST = datetime.timezone(t_delta, 'JST')
now = datetime.datetime.now(JST)
return now.strftime('%Y%m%d_%H%M')
if __name__ == '__main__':
'''
keyには保存するディレクトリ名、
valueには保存するディレクトリまでの絶対パスを指定する
'''
collect_dir_dict_list = {
"hoge_project": "/Users/username/hoge_app",
"fuga_project": "/Users/username/fuga_app"}
# 作成した収集したログをtar.gzで出力する場所を指定
save_dir_path = "/Users/username/blog_admin/backup_app"
# 生成するtar.gzファイルの名前を設定する
tar_file_name = "collect_dirs"
# ディレクトリバックアップを実行
dirs_backup_exec(collect_dir_dict_list, save_dir_path, tar_file_name)