centos7指定目录上传到google云盘

from datetime import datetime, timedelta
from concurrent.futures import ThreadPoolExecutor
import os,time,subprocess,traceback

def run_cmd(command):
    """运行命令并返回输出。"""
    shell = True
    print('command',command)
    result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell)
    if result.returncode != 0:
        print('err command',command)
        raise Exception("Command failed: ", result.stderr)
    return str(result)


def run_command(command):
    """运行命令并返回输出。"""
    result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    # print('command',command)
    # print(result)
    # if result.returncode != 0:
    #     print('err command',command)
    #     raise Exception("Command failed: ", result.stderr)
    return result.stdout


def check_folder_exists_in_gdrive(folder_name, parent_id):
    """检查给定名称的文件夹在Google Drive中是否存在,如果存在则返回其ID."""
    # 列出所有匹配名称的文件夹
    query = f"'{parent_id}' in parents and mimeType='application/vnd.google-apps.folder' and name='{folder_name}' and trashed=false"
    command = ['/usr/local/bin/gdrive', 'files', 'list', '--query', query, '--skip-header', '--max', '1']

    try:
        output = run_command(command)
    except:
        return None

    # 解析命令输出
    lines = output.strip().split('\n')
    if lines and lines[0]:
        # 假设输出格式是: id name
        folder_id = lines[0].split(' ')[0]
        return folder_id
    return None

def create_folder_in_gdrive(folder_name, parent_id):
    """在Google Drive中创建一个文件夹,返回新创建的文件夹的ID."""
    command = ['/usr/local/bin/gdrive', 'files', 'mkdir', '--parent', parent_id, folder_name]
    output = run_command(command)

    # 解析命令输出
    lines = output.strip().split('\n')
    # print("lines",lines)
    if lines and f"Created directory '{folder_name}' with id" in lines[0]:
        # 假设输出格式是: Directory <id> created in parent <parent_id>
        folder_id = lines[0].split(': ')[1]
        return folder_id
    else:
        raise Exception("Failed to create directory")

# 这个函数会在Google Drive中创建相应的文件夹结构,并返回最后一个文件夹的ID
def create_remote_folder_structure(remote_path):
    # 分割路径为单独的部分
    folders = remote_path.split(os.sep)
    parent_id = 'root'  # 假设从Drive的根目录开始创建
    
    # folders.insert(0,'l2_data')
    # print('folders',folders)
    for folder in folders:
        
        # 检查该文件夹是否已经在Google Drive中存在
        existing_folder_id = check_folder_exists_in_gdrive(folder, parent_id)
        
        if existing_folder_id:
            # 如果文件夹已经存在,则下一次循环使用该ID作为父ID
            parent_id = existing_folder_id
        else:
            # 如果文件夹不存在,则创建它,并使用新ID作为父ID
            parent_id = create_folder_in_gdrive(folder, parent_id)
    
    # 返回最终文件夹的ID
    return parent_id

def upload(local_path,remote_path):
    if(os.path.isdir(local_path)):
        for root, dirs, files in os.walk(local_path):
            for file in files:
                local_file_path = os.path.join(root, file)
                
                relative_path = os.path.relpath(local_file_path, local_path)
                gdrive_folder_path = os.path.dirname(relative_path)
                
                remote_dir = os.path.join(remote_path,local_path.rstrip('/').split('/')[-1],gdrive_folder_path).rstrip('/')
                print('开始上传:',local_file_path,remote_dir,int(time.time()))
                
                folder_id = create_remote_folder_structure(remote_dir)
                cmd = ['/usr/local/bin/gdrive', 'files', 'upload', '--parent', folder_id, local_file_path]
                ustatus = run_command(cmd)
                if('successfully uploaded' in ustatus):
                    print('上传成功',int(time.time()))
                else:
                    print('上传失败',int(time.time()))
                    
    elif(os.path.isfile(local_path)):
        print('开始上传:',local_path,remote_path.rstrip('/'),int(time.time()))
        folder_id = create_remote_folder_structure(remote_path.rstrip('/'))
        cmd = ['/usr/local/bin/gdrive', 'files', 'upload', '--parent', folder_id, local_path]
        ustatus = run_command(cmd)
        if('successfully uploaded' in ustatus):
            print('上传成功',int(time.time()))
        else:
            print('上传失败',int(time.time()))
    else:
        print('err',local_path)



upload(lpath,rpath)

需要安装gdrive客户端

centos7服务器上的文件上传到谷歌云盘(google drive)_centos上传谷歌-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_37500838/article/details/134980993?spm=1001.2014.3001.5502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/382639.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试大作业】京东系统的Selenium自动化测试报告

1访问地址 https://wwwjd.com 2 点击左侧导航 手机/运营商/数码 2点击左侧导航"影音娱乐"的子类"蓝牙/无线耳机 4商品筛选点击查询的第一个商品(选择默认类型款式颜色)一>6.设置商品数量,点击"加入去购物车结算" Selenium测试的数据驱动设置 请结…

C#,泰波拿契数(Tribonacci Number)的算法与源代码

1 泰波拿契数&#xff08;Tribonacci Number&#xff09; 泰波拿契数&#xff08;Tribonacci Number&#xff09;是斐波那契的拓展。 泰波拿契数 (Tribonacci Number) 即把费波拿契数 (Fibonacci Number) 的概念推广至三个数。 2 计算结果 3 源程序 using System; namespace…

Linux Shell编程系列--变量的定义与使用

一、目的 上一篇我们简单介绍了shell脚本的组成以及如何运行一个shell脚本&#xff0c;本篇将详解讲解shell中的变量。在Shell脚本中&#xff0c;变量是用来存储和处理数据的基本结构。 二、介绍 1、定义变量 变量名与等号&#xff08;&#xff09;后跟值来定义一个变量&#…

antdpro框架npm install 报错,切换tyarn安装成功。

报错日志 有时间补 当前版本 解决办法 进入工作目录 安装官方推荐的tyarn工具&#xff1a;npm install yarn tyarn -g 进行依赖安装&#xff1a;tyarn 启动项目 &#xff1a;tyarn start 注意&#xff1a; 技术迭代较快&#xff0c;建议查询官网后实践&#xff0c;以上作为…

大模型实战营第二期——3. 基于 InternLM 和 LangChain 搭建你的知识库

github地址&#xff1a;InternLM/tutorial-书生浦语大模型实战营文档地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库视频地址&#xff1a;基于 InternLM 和 LangChain 搭建你的知识库Intern Studio: https://studio.intern-ai.org.cn/console/instance动手学大模型…

前端面试题——JS实现反转链式表

前言 反转单向链表就是将整个单链表的数据进行倒序的过程。 例如&#xff0c;如果反转之前的单链表是0->1->2->3&#xff0c;那么反转之后的单链表应该是3->2->1->0。这个操作通常是通过改变链表中每个节点的指针方向来实现的&#xff0c;即让每个节点的指…

《Git 简易速速上手小册》第10章:未来趋势与扩展阅读(2024 最新版)

文章目录 10.1 Git 与开源社区10.1.1 基础知识讲解10.1.2 重点案例&#xff1a;Python 社区使用 Git10.1.3 拓展案例 1&#xff1a;Git 在大型开源项目中的角色10.1.4 拓展案例 2&#xff1a;支持开源项目的 Git 托管平台 10.2 新兴技术与 Git 的整合10.2.1 基础知识讲解10.2.2…

猫头虎分享已解决Bug || Go Error: Missing Return at End of Function

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【算法与数据结构】42、LeetCode接雨水

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

猫头虎分享已解决Bug || Go Error: redeclared as imported package name ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

微服务入门篇:http客户端Feign(远程调用,自定义配置,Feign的性能优化,Feign服务抽取)

目录 1.基于Feign的远程调用1.RestTemplate方式调用存在的问题2.Feign的介绍3.定义和使用Feign客户端 2.自定义配置1.方式一&#xff1a;配置文件方式2.方式二: java代码方式&#xff0c;需要先声明一个Bean: 3.Feign的性能优化1.Feign底层的客户端实现2.连接池配置 4.Feign的最…

Java:JDK8新特性(Stream流)、File类、递归 --黑马笔记

一、JDK8新特性&#xff08;Stream流&#xff09; 接下来我们学习一个全新的知识&#xff0c;叫做Stream流&#xff08;也叫Stream API&#xff09;。它是从JDK8以后才有的一个新特性&#xff0c;是专业用于对集合或者数组进行便捷操作的。有多方便呢&#xff1f;我们用一个案…

课堂秩序要求有哪些内容

你是否曾经疑惑&#xff0c;为什么有些课堂总是秩序井然&#xff0c;而有些则混乱不堪&#xff1f;作为一位经验丰富的老师&#xff0c;我想告诉你&#xff0c;课堂秩序不仅仅是学生安静听讲那么简单&#xff0c;它背后涉及到许多关键因素&#xff0c;直接影响着教学质量和学习…

Learn LaTeX 015 - LaTex Typeset 抄录

https://www.douyin.com/user/self?modal_id7306721102380764453&showTabpost GitHub address: https://github.com/yasenstar/learn_latex Gitee address: https://gitee.com/yasenstar/learn_latex

Acwing---837. 连通块中点的数量

连通块中点的数量 1.题目2.基本思想3.代码实现 1.题目 给定一个包含 n n n个点&#xff08;编号为 1 ∼ n 1∼n 1∼n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 m m m 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 a 和点 b …

k8s-资源限制与监控 15

资源限制 上传实验所需镜像 Kubernetes采用request和limit两种限制类型来对资源进行分配。 request(资源需求)&#xff1a;即运行Pod的节点必须满足运行Pod的最基本需求才能 运行Pod。 limit(资源限额)&#xff1a;即运行Pod期间&#xff0c;可能内存使用量会增加&#xff0…

视觉SLAM十四讲学习笔记(二)三维空间刚体

哔哩哔哩课程连接&#xff1a;视觉SLAM十四讲ch3_哔哩哔哩_bilibili​ 目录 一、旋转矩阵 1 点、向量、坐标系 2 坐标系间的欧氏变换 3 变换矩阵与齐次坐标 二、实践&#xff1a;Eigen&#xff08;1&#xff09; 运行报错记录与解决 三、旋转向量和欧拉角 1 旋转向量 …

dolphinDB创建适合存放股票代码的分布式数据库

这里我们使用基于哈希分区的数据库&#xff1a; my_db database(db_path, HASH, [SYMBOL, 10])这行代码指定基于哈希分区&#xff0c;同时哈希值使用10个长度&#xff0c;这样既可以存放一般的股票代码&#xff0c;也可以存放比如期权这种比较长的代码 更多的分区表情况请参…

网络编程项目:电子辞典

项目要求&#xff1a; 登录注册功能&#xff0c;不能重复登录&#xff0c;重复注册。用户信息也存储在数据库中。单词查询功能历史记录功能&#xff0c;存储单词&#xff0c;意思&#xff0c;以及查询时间&#xff0c;存储在数据库基于TCP&#xff0c;支持多客户端连接&#x…

Leecode之反转链表

一.题目及剖析 https://leetcode.cn/problems/reverse-linked-list/description/ 二.思路引入 设定三个指针,n1指向空, n2指向head,n3指向下一个元素,将n2->next指向n1,然后三个指针向后遍历重复即可 三.代码引入 /*** Definition for singly-linked list.* struct List…