通过重命名在GCS下移动文件

时间:2019-02-27 18:47:15

标签: bash google-cloud-storage gsutil

我想编写以下bash脚本,该脚本使用重命名选项将文件从一个GCS存储桶复制到另一个GCS存储桶。

我的输入文件夹是gs://test-rtt-integration/result/frd/*.orc 而我的目标文件夹是gs://test-rtt-integration/recent_files/frd

应根据gs://test-rtt-integration/complex-files/TAN/recent_files/today/frd提供的名称来重命名复制的文件 复制完成重命名后,我需要清除gs://test-rtt-integration/result/frd

我测试了以下命令,但它们无法正常工作

NAME = "$(gsutil ls gs://test-rtt-integration/complex-files/TAN/recent_files/today/frd)"
gsutil mv gs://test-rtt-integration/result/frd/*.orc   gs://test-rtt-integration/recent_files/frd/$NAME
gsutil rm -rf gs://test-rtt-integration/result/frd

(应删除所有.orc文件和其他文件)

但这不能正常工作,因为我必须基于/分割NAME并获得最后的分割,所以如果分割的结果称为SPLIT,我就必须gsutil mv gs://test-rtt-integration/result/frd/*.orc gs://test-rtt-integration/recent_files/frd/$SPLIT

关于如何执行此操作的任何想法?

1 个答案:

答案 0 :(得分:0)

问题有点令人困惑。您说您想将文件从一个Google Cloud Storage存储桶移动到另一个存储桶,但是所有操作都在一个称为var id int var username string var activites []string row := db.QueryRow("SELECT id, username, activities FROM users WHERE id = 1") err := row.Scan(&id, &username, &activites) 的存储桶中进行。

但是,只要您使用命令test-rtt-integration获得文件位置,例如gsutil ls gs://[BUCKET_NAME]/folder,因为文件夹中所有对象的gs://[BUCKET_NAME]/folder/[FILENAME].orc部分始终是相同的,所以只需将其替换为gs://[BUCKET_NAME]/folder/,您将只获得结尾处的对象名称为{{1 }}等

我不确定这是否正是您要寻找的东西,但是我做了一些自我编码,并创建了一个bash脚本,该脚本是:

  • null存储桶文件夹中获取每个对象的名称
  • 将所有对象从[FILENAME].orc存储桶文件夹复制到gs://[BUCKET_NAME]/from存储桶文件夹
  • gs://[BUCKET_NAME]/from存储桶文件夹中删除所有对象

内部有注释,详细解释了每个操作的工作方式。如果这不是您要找的东西,您可以了解其工作原理,并以更适合您的不同方式实施它。我已经在Google Cloud Shell中测试了该脚本,它正在运行。 example code can be found in GitHub