使用 gsutil 保留路径复制文件列表(-I 标志)

使用 gsutil 保留路径复制文件列表(-I 标志)

我正在尝试将所有图片和静态文件复制到 Google Cloud Platform 中的存储桶中。

我正在尝试从我的应用程序的根目录执行此命令:

find -regextype posix-extended -iregex ".*\.(js|css|png|jpg|gif|ttf|cur|woff|eot)" | gsutil -m cp -I gs://example-bucket/

我的文件位于如下文件夹中:

./pictures/bg/img.png
./pictures/pictures/dog.jpg
./fonts/modern.woff

gsutil 命令中的标志-I告诉它从 stdin 加载文件列表,该标志-m只是进行多线程上传。

这一切都正常,我看到我的文件在存储桶中,但是,所有文件都丢失了它们的原始路径并被发送到存储桶的根目录,如下所示:

gs://example-bucket/img.png
gs://example-bucket/dog.jpg
gs://example-bucket/modern.woff

想要的结果是这样的:

gs://example-bucket/pictures/bg/img.png
gs://example-bucket/pictures/pictures/dog.jpg
gs://example-bucket/fonts/modern.woff

我希望文件保留其原始路径。

我也尝试过这个并得到了相同的结果:

gsutil -m cp -r ./**/*.{js,css,png,jpg,gif,ttf,cur,woff,eot} gs://example-bucket/

唯一可行的办法就是做一个 for 循环

for ..get-files..
begin
    gsutil cp $i gs://example-bucket/$i
end

并且

find ..find-expr.. -exec gsutil cp {} gs://example-bucket/{}

但这两者对于我的工作流程来说都太慢了。

在此先感谢您的帮助。

答案1

无论哪种方法(使用枚举文件find或使用 gsutil 递归(**)通配符)都会生成复制源的路径名列表,并且当您以这种方式运行它时,gsutil 将始终“展平”路径。gsutil 以这种方式工作是因为我们希望它的工作方式类似于较旧的 Unix / Linux cp 命令(当您以这种方式指定时,它同样会展平路径,所有内容都被复制到单个目标目录中)。

为了避免路径变平,您需要生成一个脚本,为每个对象提供完整路径:

gsutil cp pictures/bg/img.png gs://example-bucket/pictures/bg/img.png
gsutil cp pictures/pictures/dog.jpg gs://example-bucket/pictures/pictures/dog.jpg
...

为了获得并行性,您可以在后台运行每个命令:

gsutil cp pictures/bg/img.png gs://example-bucket/pictures/bg/img.png &
gsutil cp pictures/pictures/dog.jpg gs://example-bucket/pictures/pictures/dog.jpg &
...
wait

如果您要复制大量文件,则可能需要限制并行性以避免机器过载(执行 N 然后等待,执行下一个 N 然后等待,等等)

相关内容