python制作文件备份_python文件自动同步备份v1.0

本文介绍了使用Python在H3C CAS平台上备份虚拟机文件至服务器A,并从A同步到B和C的过程。通过服务器A生成校验文件,服务器B进行校验并同步更新。测试环境为win10到CentOS7,使用Python3.7。文章详细展示了如何开启HTTP服务、设置服务端和客户端脚本,以及进行测试验证。
摘要由CSDN通过智能技术生成

fffd1703083ea3c412136a19737b12d1.png

需求:

h3c的cas平台打包备份虚拟机文件到服务器A,通过A同步到服务器B和C。

思路:

服务器A遍历目标文件夹和文件生成一个带有文件和文件夹信息的校验文件。

服务器B下载校验文件,校验本地的备份文件夹并同步下载/同步删除。

A和B通过python的http服务传输。

测试环境:

win10→CentOS7, python3.7.

接下来我们开始:

一、python开启http服务

在win10上找到需要备份的文件夹,在空白处shift+鼠标右键,点击在此处打开powershell窗口。

959c6aa5874dd4c22d77b62073b10462.png

然后输入:

python -m http.server 8000

f832ed3b4b6109d58e041dbcfa5f1d3b.png

二、服务端

import os

path = r'C:Users001Desktopbackup' # 需要备份的文件夹

# 通过os.walk()方法遍历到所有文件夹和文件
def content(path):
    list = []
    dir = []
    x = os.walk(path, topdown=True)
    for (root, dirs, files) in x:
        dir.append(root.replace(r'C:Users001Desktopbackup', ''))
        for j in files:
            list.append(root.replace(r'C:Users001Desktopbackup', '') + '' + j)
    return [dir, list]

x = content(path)

# 生成校验文件
with open(path+''+'init.txt', 'w', encoding='utf-8') as f:
    for i in x[1]:
        f.write(i)
        f.write('n')

with open(path+''+'dir.txt', 'w', encoding='utf-8') as f:
    for i in x[0]:
        f.write(i)
        f.write('n')

三、客户端

import os
import requests
import shutil
import time
from tqdm import tqdm

# tqdm用来做进度条,可选

start_time = time.perf_counter()

def init():
    # 下载服务端目录,文件信息
    url = ['http://192.168.1.13:8000/init.txt', 'http://192.168.1.13:8000/dir.txt']

    download_init = requests.get(url[0], stream=True)
    with open('/download/init.txt', 'wb') as f:
        for chunk in download_init.iter_content(chunk_size=1024):
            f.write(chunk)

    download_dir = requests.get(url[1], stream=True)
    with open('/download/dir.txt', 'wb') as f:
        for chunk in tqdm(download_dir.iter_content(chunk_size=1024)):
            f.write(chunk)

init()

path = '/download/backup' # 存放备份文件的目录

def content(path):
    # 通过os.walk()方法遍历到所有文件夹和文件
    list = []
    dir = []
    x = os.walk(path, topdown=True)
    for (root, dirs, files) in x:
        dir.append(root)
        for j in files:
            list.append(root+ '/' + j)
    return [dir, list]


def check_dir():
    # 获取本地目录
    x = content(path)
    dir_so = x[0]

    # 清洗服务端目录
    dirs = open('/download/dir.txt', 'r', encoding='utf-8')
    dir_dst = dirs.readlines()
    dir_dst_info = []
    for i in dir_dst:
        i = i.replace('n', '')
        i = i.replace('', '/')
        i = '/download/backup' + i # 修改路径不然会报错
        dir_dst_info.append(i)


    # 比较目录,目录不一致就添加
    for i in dir_dst_info[1:]+dir_so:
        if i not in dir_so:
            os.mkdir(i)
            print('创建了' + i)
        if i not in dir_dst_info:
            try:
                shutil.rmtree(i)
                print('删除了' + i)
            except:
                pass


check_dir()

def check_file():
    # 获取本地文件
    x = content(path)
    file_so = x[1]

    # 清洗服务端文件
    files = open('/download/init.txt', 'r', encoding='utf-8')
    files_dst = files.readlines()
    files_dst_info = []
    for i in files_dst:
        i = i.replace('n', '')
        i = i.replace('', '/')
        files_dst_info.append('/download/backup' + i)

    # 没有的下载,多余的删掉
    for i in file_so + files_dst_info:
        if i not in file_so:
            url = 'http://192.168.1.13:8000' + i.replace('/download/backup', '')
            download_file = requests.get(url, stream=True)
            with open(i, 'wb') as f :
                for chunk in download_file.iter_content(chunk_size=10240) :
                    f.write(chunk)
                    print('添加了' + i)
        if i not in files_dst_info:
            os.remove(i)
            print('删除了' + i)

check_file()

end_time =time.perf_counter()
cost = end_time - start_time
print(cost,':s')

四、测试

1、随便在服务端备份目录里添加文件。

e7e1e491be31e27599ab645daa266873.png

2、执行服务端的python文件。

2eb971ba64db20c5335e9eeb43fa39f2.png

会在本地生成init.txt, dir.txt。

cf9485371883cebf12a088aa7031320d.png
init记录的是文件信息,dir记录的是目录信息。

3、执行客户端的python文件。

947fe923cc5bedc518627c2145f3d244.png

正在执行。

a4ed1f7df71a468299d8be517726a06d.png

执行完成。

总结:

还可以再研究下多进程/多线程,效率还会更高。

如果有更好的思路欢迎指教。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值