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

Split and copy a file from a bucket to another bucket, without downloading it locally

我想拆分并将一个大文件从一个存储桶(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 个分片用于传输是可以的)。

如果不下载就无法完成,但您可以使用范围读取来构建片段,而无需立即下载完整文件,例如,

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
...