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

python制作文件备份_python文件自动同步备份v1.0_第1张图片

需求:

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

思路:

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

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

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

测试环境:

win10→CentOS7, python3.7.

接下来我们开始:

一、python开启http服务

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

python制作文件备份_python文件自动同步备份v1.0_第2张图片

然后输入:

python -m http.server 8000

python制作文件备份_python文件自动同步备份v1.0_第3张图片

二、服务端

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、随便在服务端备份目录里添加文件。

python制作文件备份_python文件自动同步备份v1.0_第4张图片

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

python制作文件备份_python文件自动同步备份v1.0_第5张图片

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

python制作文件备份_python文件自动同步备份v1.0_第6张图片
init记录的是文件信息,dir记录的是目录信息。

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

python制作文件备份_python文件自动同步备份v1.0_第7张图片

正在执行。

python制作文件备份_python文件自动同步备份v1.0_第8张图片

执行完成。

总结:

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

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

你可能感兴趣的:(python制作文件备份)