仅将某些文件移动到 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 脚本,将它们移动到您想要的目录。您可能可以使用本地编辑工具来简化此操作(例如 awk
或 sed
)。
【讨论】:
谢谢。但是如果我创建一个列表,如何控制一次只运行一个 gsutil mv 而不是一次运行的事实? 您是指多个 mv 操作不会作为原子事务发生的事实吗?这是不可能的——GCS 一次只提供对一个对象的操作的原子性。以上是关于仅将某些文件移动到 GCP 并保留子文件夹的主要内容,如果未能解决你的问题,请参考以下文章
在 NTFS 上的驱动器之间移动文件夹并保留时间戳 [关闭]