Скопировать список файлов (флаг -I) с сохранением пути gsutil

Я пытаюсь скопировать все изображения и статические файлы в мою корзину 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 говорит ему загрузить список файлов из 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 работает таким образом, потому что мы хотели, чтобы он работал аналогично более старой команде 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, затем подождите и т. Д.)

Другие вопросы по тегам