一、前言
之前因为疫情常常不知道会不会被封在家里,又不想把电脑带过来带过去,就做了这个自动备份的脚本。
功能如下:
- 自动从指定根目录里将找到的所有指定后缀名的文件备份到一个备份文件夹里;备份文件架确保和根目录完全一致,即同步更新也同步删除
- 将备份文件夹中的文件自动和阿里云盘同步,同样完全一致,同步更新/删除;
- 原文件目录结构不会改变;
- 可以屏蔽根目录下一级中不想要的文件夹/文件,下多级的不行;
- 定时运行;
- 初版很傻,每天都会带着所有文件去访问云盘,导致调用api次数太多频繁被墙,大大降低脚本运行效率,现在已改成若文件哈希值没变则直接跳过
二、代码
创建了一个AutoTransfer类,这个类在初始化的时候会自动读取配置文件里的参数,如果没有配置文件也可以后续调用函数时来传参。
调用类里的move_scripts函数可以将指定后缀名的文件备份到备份文件夹里。
调用ali_login函数登录阿里云。
调用find_id函数可以根据阿里云盘里的文件夹名查找文件夹id,这个id后面要用。
调用sync_folder函数进行同步,file_id就是上面的文件夹id,flag表示同步方式,True代表以本地为主。
#!/usr/bin/env python
# coding: utf-8
import os
import sys
import json
import fnmatch
import filecmp
from typing import List, Dict, Union, Callable, Optional
from shutil import copyfile, rmtree
from functools import reduce
from pathlib import Path
from tqdm import tqdm
from aligo import Aligo
class AutoTransfer:
def __init__(self, config_file='transfer_config.json'):
self.config_file = config_file
# 自动从配置json里获取参数
if os.path.exists(config_file):
with open(config_file, mode='r', encoding='utf-8') as c:
cfg = json.load(c)
for k, v in cfg.items():
setattr(self, k, v)
def __setattr__(self, k, v):
if '_' != k[0]:
print(f"Current attribute '{
k}' is '{
v}'")
self.__dict__[k] = v
@staticmethod
def list_dir(
cur_path: str,
ext_filter: Optional[List] = None
) -> List:
"""
列举文件根目录下各文件的路径.
Parameters
----------
cur_path: str
根目录.
ext_filter: Optional[List], default None
用作筛选的后缀名.
Returns
-------
List
文件路径列表.
"""
file_paths = []
for root, dirs, files in os.walk(cur_path):
for file in files:
file_paths.append(os.path.join(root, file)<