如何使用“gsutil”复制文件夹?
Posted
技术标签:
【中文标题】如何使用“gsutil”复制文件夹?【英文标题】:How to copy folders with 'gsutil'? 【发布时间】:2020-04-15 09:35:44 【问题描述】:我已阅读有关gsutil cp
命令的文档,但仍然不明白如何复制文件夹以保持相同的权限。我试过这个命令:
gsutil cp gs://bucket-name/folder1/folder_to_copy gs://bucket-name/folder1/new_folder
但它导致了错误:
CommandException: No URLs matched
虽然,当我尝试在每个名称的末尾加上斜线时,它没有显示任何错误:
gsutil cp gs://bucket-name/folder1/folder_to_copy/ gs://bucket-name/folder1/new_folder/
但是,当我检查gsutil ls
时,存储桶中没有新文件夹。我做错了什么?
【问题讨论】:
文件夹权限是什么意思?你在谈论 ACL 吗? 【参考方案1】:您应该使用-r
选项递归地复制文件夹及其内容:
gsutil cp -r gs://bucket-name/folder1/folder_to_copy gs://bucket-name/folder1/new_folder
请注意,这仅在 folder_to_copy
包含文件时才有效。这是因为 Cloud Storage 并没有像典型 GUI 中所期望的那样真正具有“文件夹”,而是提供了“平面”名称空间顶部的分层文件树的错觉,正如 here 所解释的那样。换句话说,文件夹中的文件只是附加了文件夹前缀的对象。因此,当您执行 gsutil cp
时,它希望复制实际对象而不是 CLI 无法理解的空目录。
另一种方法是简单地使用rsync
代替,它允许使用空文件夹并在源文件夹和目标文件夹之间同步内容:
gsutil rsync -r gs://bucket-name/folder1/folder_to_copy gs://bucket-name/folder1/new_folder
如果您还想保留对象的 ACL(权限),请使用 -p
选项:
gsutil rsync -p -r gs://bucket-name/folder1/folder_to_copy gs://bucket-name/folder1/new_folder
【讨论】:
@praytic - 要添加到这个答案,这是正确的,您可以使用通配符*
。 cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames
但我不想复制文件夹的内容。我需要复制文件夹的权限并创建一个具有相同权限的新文件夹。
@Praytic 好吧,正如here 提到的那样,文件夹在 Cloud Storage 中并不存在,因此您无法为它们分配权限。不过,您可以为单个对象提供 ACL,并在执行 gsutil rsync
或其他 gsutil
命令时使用 -p
选项保留它。【参考方案2】:
要添加到@Maxim 的答案,您可以考虑在调用gsutil
时使用-m
参数以允许并行复制。
gsutil -m cp -r gs://bucket-name/folder1/folder_to_copy gs://bucket-name/folder1/new_folder
-m
arg 启用并行性。
正如gsutil
文档中所建议的那样,-m
参数可能不会在网络速度较慢的情况下产生更好的性能(即,在家里)。但是对于跨桶复制(数据中心中的机器)的情况,性能可能会“显着提高”,以引用 gsutil 手册。见下文
-m Causes supported operations (acl ch, acl set, cp, mv, rm, rsync,
and setmeta) to run in parallel. This can significantly improve
performance if you are performing operations on a large number of
files over a reasonably fast network connection.
gsutil performs the specified operation using a combination of
multi-threading and multi-processing, using a number of threads
and processors determined by the parallel_thread_count and
parallel_process_count values set in the boto configuration
file. You might want to experiment with these values, as the
best values can vary based on a number of factors, including
network speed, number of CPUs, and available memory.
Using the -m option may make your performance worse if you
are using a slower network, such as the typical network speeds
offered by non-business home network plans. It can also make
your performance worse for cases that perform all operations
locally (e.g., gsutil rsync, where both source and destination
URLs are on the local disk), because it can "thrash" your local
disk.
If a download or upload operation using parallel transfer fails
before the entire transfer is complete (e.g. failing after 300 of
1000 files have been transferred), you will need to restart the
entire transfer.
Also, although most commands will normally fail upon encountering
an error when the -m flag is disabled, all commands will
continue to try all operations when -m is enabled with multiple
threads or processes, and the number of failed operations (if any)
will be reported as an exception at the end of the command's
execution.
注意:在撰写本文时,python3.8 似乎导致-m
标志出现问题。使用python3.7。更多信息Github Issue
【讨论】:
我们是否要以如下所示的方式从 gs 存储桶中复制文件,gsutil cp -r gs://ukbb-exome-public/300k/results/results.mt ./ gsutil cp -r gs://ukbb-exome-public/300k/results/variant_results.mt ./ 有没有办法启用并行性?【参考方案3】:对于不想安装整个 SDK 并改用 Docker 的人,这是我用来将 Bucket 下载到名为 googledata 的 Docker 卷的一系列命令。 (将 gs://assets 替换为您的 Bucket 名称)
docker pull google/cloud-sdk:latest
docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login
docker run --rm -ti -v googledata:/tmp --volumes-from gcloud-config google/cloud-sdk gsutil cp -r gs://assets /tmp
Docker 容器见here。
为了获取您的数据付出了相当大的努力......
【讨论】:
以上是关于如何使用“gsutil”复制文件夹?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 gsutil 将所有文件和子文件夹从当前目录复制/移动到 Google Cloud Storage 存储桶
如何使用 gsutil 从 GCE 上的容器中复制存储桶中的文件
如何在使用 gsutil 保留 ACL 的同时将文件从 Google Cloud Storage 存储桶 1 复制到存储桶 2