我想分割并将一个巨大的文件从存储桶(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个分片)。
答案 0 :(得分:2)
这不能不下载而完成,但是您可以使用范围读取来构建片段而无需立即下载完整文件,例如
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
...