GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同

Posted

技术标签:

【中文标题】GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同【英文标题】:GCP Storage - How to create a script that copies all files/folders from one bucket to another, but in a different folder structure 【发布时间】:2021-10-20 23:55:07 【问题描述】:

GCP 上有一个存储桶,其中的文件夹命名如下。

Tests_111/tests.pdf

Tests_112/tests.pdf

AllTests_111/alltests.pdf
...

需要将这些文件夹复制到以下结构的另一个存储桶中。

Tests/111/tests.pdf

Tests/112/tests.pdf

AllTests/111/alltests.pdf

我基本上只是想检查文件夹名称,看看它是否可以被'_'拼接,这将给我“Tests”和“111”。之后,在其中创建一个名为“Tests”的文件夹和一个名为“111”的子文件夹。

我是 GCP 和 gsutils 的新手。有什么方法可以实现吗?

【问题讨论】:

Google 云存储没有文件夹/目录。命名空间是扁平的。在您的情况下,您将在用“/”字符替换第一个“_”字符时进行对象复制。几乎任何脚本语言都可以进行这种简单的字符替换。 您在寻找为您编写代码/脚本的人吗?我们帮助您解决您编写的代码的问题。 MBHA Phoenix 提供了一个很好的答案来帮助您入门。 【参考方案1】:

这里是代码 sn-p 的示例,用于将对象从一个存储桶复制到另一个存储桶

from google.cloud import storage


def copy_blob(
    bucket_name, blob_name, destination_bucket_name, destination_blob_name
):
    """Copies a blob from one bucket to another with a new name."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"
    # destination_bucket_name = "destination-bucket-name"
    # destination_blob_name = "destination-object-name"

    storage_client = storage.Client()

    source_bucket = storage_client.bucket(bucket_name)
    source_blob = source_bucket.blob(blob_name)
    destination_bucket = storage_client.bucket(destination_bucket_name)

    blob_copy = source_bucket.copy_blob(
        source_blob, destination_bucket, destination_blob_name
    )

    print(
        "Blob  in bucket  copied to blob  in bucket .".format(
            source_blob.name,
            source_bucket.name,
            blob_copy.name,
            destination_bucket.name,
        )
    )

参考:https://cloud.google.com/storage/docs/copying-renaming-moving-objects#storage-copy-object-python

因此,您只需编写逻辑代码即可正确设置来自blob_namedestination_blob_name。顺便说一下,blob 名称是完全限定的,意味着它包括文件夹名称和文件名,如Tests/111/tests.pdf

【讨论】:

以上是关于GCP 存储 - 如何创建一个脚本,将所有文件/文件夹从一个存储桶复制到另一个存储桶,但文件夹结构不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 创建多个 GCP 存储桶

将python库用于GCP时如何切换项目目标?

Terraform GCP 启动脚本本地文件而不是内联文件

如何使用 gsutil 向 GCP 存储桶添加 pubsub 通知

用于 python 输出数据文件的 GCP 云函数

使用 sql server 作业上传到 gcp 存储桶