Я пытаюсь скопировать все изображения и статические файлы в свое ведро в 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
Флаг -I
в команде gsutil указывает ему загрузить список файлов из стандартного ввода, флаг -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/{}
Но и то, и другое слишком медленно для моего рабочего процесса.
Заранее спасибо за вашу помощь.
Любой подход (перечисление файлов с использованием find
или используя рекурсивный (**) подстановочный знак gsutil) создает список имен путей для источника копии, и gsutil всегда будет «сглаживать» пути, когда вы запускаете его таким образом. gsutil работает таким образом, потому что мы хотели, чтобы он работал аналогично старой команде cp Unix / Linux (которая аналогичным образом сглаживала бы пути, когда вы указываете этот способ, и все они копируются в один целевой каталог).
Чтобы избежать плоских путей, вам нужно будет сгенерировать сценарий, который предоставляет полные пути для каждого объекта:
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, а затем подождите и т. Д.)