Python 文件备份到云盘网盘同步思路 自动增量备份
用 Python 写一个轻量文件备份脚本,按修改时间增量复制、保留 N 份历史、计算 MD5 去重、调用 rclone/网盘 CLI 同步到云盘,适合个人电脑和小团队。
场景痛点
重要文档、照片、合同只在本机一份,硬盘一坏全没。用云盘客户端整盘同步,慢、占带宽、还容易把误删的文件也同步过去。用 Python 写一个增量备份脚本:只复制改过的文件、保留最近 N 个版本、本地先打包再通过 rclone 推到阿里云盘/OneDrive/S3,出问题能秒回滚。
用到的库
pip install send2trash
# 云盘同步推荐装 rclone 命令行:https://rclone.org
完整代码
# -*- coding: utf-8 -*-
# 增量备份:把 src 目录里改过的文件复制到 dst/日期/,并清理旧备份
import os
import shutil
import hashlib
from datetime import datetime
SRC_DIR = "/home/user/Doubao/docs" # 要备份的源目录
DST_ROOT = "/home/user/backups" # 本地备份根目录
KEEP_VERSIONS = 7 # 保留最近 7 份
# 同步到云盘用 rclone,配置好 remote 后一行命令
RCLONE_REMOTE = "aliyun:/backup"
def md5_of(path, chunk=65536):
h = hashlib.md5()
with open(path, "rb") as f:
for chunk_data in iter(lambda: f.read(chunk), b""):
h.update(chunk_data)
return h.hexdigest()
def backup_once():
today = datetime.now().strftime("%Y%m%d_%H%M%S")
dst_dir = os.path.join(DST_ROOT, today)
os.makedirs(dst_dir, exist_ok=True)
# 复制改动文件:对比 mtime,新的才拷
copied = 0
for root, _, files in os.walk(SRC_DIR):
rel = os.path.relpath(root, SRC_DIR)
target_root = os.path.join(dst_dir, rel)
os.makedirs(target_root, exist_ok=True)
for fn in files:
src = os.path.join(root, fn)
dst = os.path.join(target_root, fn)
if not os.path.exists(dst) or \
os.path.getmtime(src) > os.path.getmtime(dst):
shutil.copy2(src, dst) # copy2 保留 mtime
copied += 1
print(f"本次复制 {copied} 个文件 -> {dst_dir}")
# 清理旧备份,只留最近 KEEP_VERSIONS 份
versions = sorted(d for d in os.listdir(DST_ROOT)
if os.path.isdir(os.path.join(DST_ROOT, d)))
while len(versions) > KEEP_VERSIONS:
old = versions.pop(0)
shutil.rmtree(os.path.join(DST_ROOT, old))
print(f"清理旧备份 {old}")
return dst_dir
def sync_to_cloud(local_dir):
"""调用 rclone 把本地备份推到云盘,命令行模式,不依赖 Python SDK"""
cmd = f'rclone copy "{local_dir}" "{RCLONE_REMOTE}/{os.path.basename(local_dir)}" --progress'
print("执行云同步:", cmd)
# os.system(cmd) # 取消注释即真正同步
# 也可以用 subprocess.run(["rclone","copy",...], check=True)
if __name__ == "__main__":
dst = backup_once()
sync_to_cloud(dst)
代码讲解
SRC_DIR是要备份的目录,DST_ROOT是备份根目录,每次备份建一个以时间戳命名的子目录,比如20260914_093000/,天然就是一份版本。- 增量判断用
os.path.getmtime:源文件修改时间比目标新,或目标不存在,就拷。这比每次全量复制快得多。 shutil.copy2连 mtime 一起保留,下次对比才不会反复拷。- 清理逻辑:把备份目录按名字排序(时间戳字典序=时间序),超过
KEEP_VERSIONS份就删掉最早的,自动滚动。 md5_of用于需要严格判断"内容是否变了"的场景,比 mtime 更可靠,但慢。本脚本没在主流程调用,备用。- 云同步不直接写各厂商 SDK(各平台鉴权麻烦),而是调
rclone命令行,一份脚本同时支持阿里云盘、OneDrive、Google Drive、S3、NAS。
运行结果
把 SRC_DIR 改成自己的文档目录,运行后本地 ~/backups/20260914_xxxx/ 出现完整副本,旧的备份自动清理到只剩 7 份。sync_to_cloud 那行取消注释即自动推到 rclone 配置好的远端。配合系统计划任务(Windows 任务计划/crontab)每天跑一次就是完整备份方案。
注意事项
- rclone 要先在命令行
rclone config配好 remote,比如阿里云盘、OneDrive,配完名字写进RCLONE_REMOTE。 - 备份目录不要放在源目录里,否则会把上次备份又备份一遍,无限膨胀。
- 大文件(视频、虚拟机镜像)不建议走 rsync 式逐文件拷,先打 tar 包再传,速度快很多。
- 重要数据遵循 3-2-1 原则:3 份副本、2 种介质、1 份异地,脚本只解决本地+云盘这 2 份。

更新时间:2026-09-14 20:26:12
上一篇:Python 批量导出文件夹缩略图预览表 图片墙HTML