将文件从存储桶拆分并复制到另一个存储桶,无需在本地下载

Posted

技术标签:

【中文标题】将文件从存储桶拆分并复制到另一个存储桶,无需在本地下载【英文标题】:Split and copy a file from a bucket to another bucket, without downloading it locally 【发布时间】:2019-10-22 18:26:39 【问题描述】:

我想拆分并将一个大文件从存储桶 (gs://$SRC_BUCKET/$MY_HUGE_FILE) 复制到另一个存储桶 (gs://$DST_BUCKET/),但不下载本地文件。我希望仅使用 gsutil 和 shell 命令来执行此操作。

我正在寻找与以下命令具有相同最终行为的东西:

gsutil cp gs://$SRC_BUCKET/$MY_HUGE_FILE my_huge_file_stored_locally

split -l 1000000 my_huge_file_stored_locally a_split_of_my_file_

gsutil -m mv a_split_of_my_file_* gs://$DST_BUCKET/

但是,因为我是在磁盘存储容量有限的 Compute Engine VM 上执行这些操作,所以无法在本地获取大文件(无论如何,这似乎是在浪费网络带宽)。

此示例中的文件按行数拆分 (-l 1000000),但如果拆分按字节数完成,我将接受答案。

我查看了有关 streaming uploads and downloads using gsutil 的文档,以执行以下操作:

gsutil cp gs://$SRC_BUCKET/$MY_HUGE_FILE - | split -1000000 | ...

但我不知道如何将拆分文件直接上传到gs://$DST_BUCKET/,而不在本地创建它们(虽然暂时只创建 1 个分片进行传输是可以的)。

【问题讨论】:

您考虑过使用 Storage Transfer Service 吗?这正是它的含义:cloud.google.com/storage-transfer/docs/overview#what_is 我知道存储传输服务可用于将文件从存储桶传输到另一个存储桶,但在这里我想在复制之前拆分文件。我在 STS (cloud.google.com/storage-transfer/docs/reference/rest/v1/…) 中看不到任何拆分输入文件的选项。 明白。您是否有必要手动进行拆分/组合?因为您可以为 gsutil 启用多线程,或使用并行上传:cloud.google.com/solutions/… 不幸的是,目标存储桶中的文件必须具有最大行数(1 000 000),或者至少具有最大大小(10MB):满足这两个条件中的任何一个对我来说都可以。 【参考方案1】:

这不能在不下载的情况下完成,但您可以使用范围读取来构建片段而无需一次下载完整文件,例如,

gsutil cat -r 0-10000 gs://$SRC_BUCKET/$MY_HUGE_FILE | gsutil cp - gs://$DST_BUCKET/file1
gsutil cat -r 10001-20000 gs://$SRC_BUCKET/$MY_HUGE_FILE | gsutil cp - gs://$DST_BUCKET/file2
...

【讨论】:

很有趣,谢谢。所以似乎不可能按特定行数分割文件,你能确认一下吗? 您可以编写一些代码(例如,在 GCE 或 App Engine 上)来完成您的要求。但是考虑到使用 gsutil 的限制,不,这是不可能的。

以上是关于将文件从存储桶拆分并复制到另一个存储桶,无需在本地下载的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用aws java sdk将文件从S3存储桶从一个区域复制到另一个区域?

composer 中的 bash 操作符,用于将最近的文件从一个 GCS 存储桶复制到另一个

将多个 .gz 文件从一个 GCS 存储桶复制到 Java 中的另一个存储桶

Amazon S3,如何将 JSON 文件复制到另一个在更新原始文件时更新的存储桶?

AWS S3在两个存储桶之间复制文件和文件夹