Copie a lista de arquivos (-I flag) com o caminho de preservação da gsutil

1

Estou tentando copiar todas as fotos e arquivos estáticos para um grupo meu no Google Cloud Platform.

Estou tentando este comando a partir do diretório raiz do meu aplicativo:

find -regextype posix-extended -iregex ".*\.(js|css|png|jpg|gif|ttf|cur|woff|eot)" | gsutil -m cp -I gs://example-bucket/

E meus arquivos estão em pastas como esta, por exemplo:

./pictures/bg/img.png
./pictures/pictures/dog.jpg
./fonts/modern.woff

O sinalizador -I no comando gsutil diz para carregar a lista de arquivos do stdin, o sinalizador -m faz um upload multi-thread.

Tudo isso funciona bem, vejo meus arquivos no bloco, no entanto, todos os arquivos perdem seus caminhos originais e são enviados para a raiz do intervalo, assim:

gs://example-bucket/img.png
gs://example-bucket/dog.jpg
gs://example-bucket/modern.woff

O resultado desejado é este:

gs://example-bucket/pictures/bg/img.png
gs://example-bucket/pictures/pictures/dog.jpg
gs://example-bucket/fonts/modern.woff

Gostaria que os arquivos preservassem seus caminhos originais.

Eu também tentei isso e obtive o mesmo resultado:

gsutil -m cp -r ./**/*.{js,css,png,jpg,gif,ttf,cur,woff,eot} gs://example-bucket/

A única coisa que parece estar funcionando é fazer um loop for

for ..get-files..
begin
    gsutil cp $i gs://example-bucket/$i
end

E também

find ..find-expr.. -exec gsutil cp {} gs://example-bucket/{}

Mas ambos são muito lentos para o meu fluxo de trabalho.

Agradecemos antecipadamente por sua ajuda.

    
por santiago arizti 16.10.2017 / 18:59

1 resposta

2

Qualquer abordagem (enumerando os arquivos usando find ou usando um caractere curinga recursivo (**) gsutil produz uma lista de nomes de caminho para a origem da cópia, e a gsutil sempre "achatará" os caminhos quando você executá-lo deste jeito. A gsutil funciona dessa maneira porque queríamos que ela funcionasse de maneira semelhante ao antigo comando cp do Unix / Linux (que também iria achatar os caminhos quando você especificasse dessa forma, sendo todos copiados em um único diretório de destino).

Para evitar que os caminhos sejam achatados, você precisa gerar um script que forneça os caminhos completos para cada objeto:

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
...

Para obter o paralelismo, você pode executar cada comando em segundo plano:

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

Se você estiver copiando um grande número de arquivos, provavelmente precisará limitar o paralelismo para evitar sobrecarregar sua máquina (faça N e espere, faça o próximo N e espere, etc.)

    
por 16.10.2017 / 19:30