我正在尝试将所有图片和静态文件复制到 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 然后等待,等等)