Копировать список файлов (- Я отмечаю) с сохранением пути gsutil

Я пытаюсь скопировать все изображения и статические файлы в свою корзину в Google Облачная платформа.

Я пытаюсь выполнить эту команду из корневого каталога моего приложения:

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/{}

Но оба они слишком медленно для моего рабочего процесса.

Заранее благодарим за помощь.

1
задан 16 October 2017 в 19:59
1 ответ

При любом подходе (перечисление файлов с помощью find или с использованием подстановочного знака gsutil рекурсивный (**)) создается список имен путей для источника копии, и gsutil всегда будет "сглаживать" пути, когда вы запускаете его таким образом. gsutil работает таким образом, потому что мы хотели, чтобы он работал аналогично старой команде cp Unix / Linux (которая аналогичным образом сглаживала бы пути, когда вы указываете этот способ, и все они копируются в один целевой каталог).

Чтобы избежать наличия путей flattenend вам нужно будет сгенерировать скрипт, который предоставляет полные пути для каждого объекта:

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, а затем подождите и т. д.)

2
ответ дан 3 December 2019 в 20:19

Теги

Похожие вопросы