前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3上传备份文件至OSS

python3上传备份文件至OSS

作者头像
Elapse
发布2020-12-18 11:07:48
4.7K0
发布2020-12-18 11:07:48
举报
文章被收录于专栏:E条咸鱼

也许这个叫前言?

上周刚忙完某安全证书的考证,本来这周就应该开始学一些应急响应的东西,碰巧碰到某大佬,问我有一个功能想实现,能不能写一个脚本凑合一下

大概功能如下

机器会定时在某个时间点,做一个机器的备份,文件目录的拓扑如上

然后在x号机器中,会有一个增量备份,所以需要在各个机器的备份文件夹中,找到该最新的增量备份,上传至阿里的OSS中

我一想,这不简单?于是就在13号的时候,上手写了个小脚本,有大佬觉得哪里不对的话欢迎指指点点

正文

我代码逻辑是

代码语言:javascript
复制
用os.walk()获取所有指定xxx后缀的备份文件->获取该文件路径->判断有没有查询过这个文件夹->利用listdir获取该文件当前路径下的所有文件->查找该目录下,最新创建的文件,并判断起后缀是否为xxx->上传oss

首先是,引用库

代码语言:javascript
复制
import oss2
import sys
import os

oss2这个是阿里封装好的sdk,直接github下载源码,或者pip install oss2安装也行

然后是,写一个oss的验证

代码语言:javascript
复制
...
auth = oss2.Auth('KeyId','KeySecret')
py_file_path=sys.path[0] #获取当前脚本所在的路径
bucket = oss2.Bucket(auth,'oss-cn-where.aliyuncs.com','bucket_name')

接着是,上传进度条和上传功能

代码语言:javascript
复制
...
def percentage(consumed_bytes, total_bytes):
    if total_bytes:
        rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
        print('\r{0}% '.format(rate), end='')
        sys.stdout.flush()

def upload_file(uploadName,filename):
    bucket.put_object_from_file(str(uploadName),str(filename),progress_callback=percentage)

接着是查找当前目录下最新创建的文件,且后缀指定为xxx

代码语言:javascript
复制
...
def find_new_file(dir):
    '''查找目录下最新的文件'''
    file_lists = os.listdir(dir)
    new_file_lists=[]
    for files_check1 in file_lists:
        if files_check1.endswith('xxx'):
            new_file_lists.append(files_check1)
        else:
            pass
    new_file_lists.sort(key=lambda fn: os.path.getmtime(dir + "\\" + fn)
                    if not os.path.isdir(dir + "\\" + fn) else 0)
    #print('最新的文件为: ' + file_lists[-1])
    file = os.path.join(dir, new_file_lists[-1])
    #print('完整路径:', file)
    return file,new_file_lists[-1]

接着就可以写本体了

先创建一个函数,用来检查这个路径是否已经查询过了

代码语言:javascript
复制
...
file_check_root=[]

然后用os.walk()遍历所有目录,返回文件路径、文件夹名、文件名这三个变量

代码语言:javascript
复制
...
for root,dirs,files in os.walk(py_file_path):

接着,for循环所有文件名,判断该文件是否以xxx结尾

代码语言:javascript
复制
...
    for i in files:
        #print('files: '+i)
        #sys.stdout.flush()
        if i.endswith('xxx'):

如果判断为指定后缀,那么执行查找,和上传

代码语言:javascript
复制
...
        if i.endswith('xxx'):
            if not root in file_check_root:
                new_file_root=find_new_file(root)
                #print(new_file_root[0])
                #sys.stdout.flush()
                file_check_root.append(root)
                filename=os.path.join(root,new_file_root[1])
                upload_file(new_file_root[1],filename)
            else:
                pass

补完全

代码语言:javascript
复制
...
        else:
            continue

代码上传到github了,虽然很垃圾,但是至少也能用嘛

代码语言:javascript
复制
https://github.com/Ernket/python-backup-alioss
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 E条咸鱼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 也许这个叫前言?
  • 正文
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档