Назад | Перейти на главную страницу

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