仅将某些文件移动到 GCP 并保留子文件夹

Posted

技术标签:

【中文标题】仅将某些文件移动到 GCP 并保留子文件夹【英文标题】:Move only certain files to GCP and keep subfolder 【发布时间】:2020-11-07 14:28:26 【问题描述】:

我想将所有扩展名为“gz”的文件及其目录“C:\GCPUpload\Additional”的文件夹/子文件夹移动到存储桶“gs://BucketName/Additional/”中的文件夹。

我需要保持文件夹结构,如下所示:

C:\GCPUpload\Additional\Example1.gz             --> gs://BucketName/Additional/Example1.gz
C:\GCPUpload\Additional\Example2.gz             --> gs://BucketName/Additional/Example2.gz
C:\GCPUpload\Additional\ExampleNot.txt          --> (Ignore this file)
C:\GCPUpload\Additional\Subfolder2\Example3.gz  --> gs://BucketName/Additional/Subfolder2/Example3.gz
C:\GCPUpload\Additional\Subfolder2\Example4.gz  --> gs://BucketName/Additional/Subfolder2/Example4.gz

这是我目前使用的命令:

  call gsutil mv -r -c "C:\GCPUpload\Additional\**\*.gz" "gs://BucketName/Additional/"

我遇到的麻烦是所有文件都被移动到存储桶的根目录(即gs://BucketName/Additional/),而忽略了它的原始文件夹/子文件夹

我该怎么写?我已经尝试并在 Google 上搜索过,但找不到可行的方法。

谢谢!!

【问题讨论】:

【参考方案1】:

当您在 shell 中使用递归通配符 (**) 时,您看到的行为是由 gsutil 实现的,以匹配相应的(较旧的)行为。

要执行您想要的操作,您需要列出您想要移动的所有对象,并创建一个单独运行 gsutil mv 命令的 shell 脚本,将它们移动到您想要的目录。您可能可以使用本地编辑工具来简化此操作(例如 awksed)。

【讨论】:

谢谢。但是如果我创建一个列表,如何控制一次只运行一个 gsutil mv 而不是一次运行的事实? 您是指多个 mv 操作不会作为原子事务发生的事实吗?这是不可能的——GCS 一次只提供对一个对象的操作的原子性。

以上是关于仅将某些文件移动到 GCP 并保留子文件夹的主要内容,如果未能解决你的问题,请参考以下文章

在 NTFS 上的驱动器之间移动文件夹并保留时间戳 [关闭]

Git - 仅将更改的文件拉到单独的文件夹中

仅将某些更改列表移动到新的 SVN 服务器

如何 git 将文件夹和文件移动到新文件夹并保留历史记录? [复制]

将Git存储库内容移动到保留历史记录的另一个存储库

SVN批量移动文件,并保留版本日志