4

我想将一个大文件从一个存储桶 ( )拆分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 虚拟机上执行这些操作,所以无法在本地获取大文件(无论如何,这似乎是在浪费网络带宽)。

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

我查看了有关使用 gsutil进行流式上传和下载的文档,以执行以下操作:

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

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

4

1 回答 1

4

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

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
...
于 2019-06-07T18:25:36.823 回答