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