Copie a estrutura de diretórios intacta para o bucket do AWS S3

24

Eu quero usar o AWS S3 cli para copiar uma estrutura de diretório completa para um bucket S3.

Até agora, tudo o que tentei copia os arquivos para o intervalo, mas a estrutura de diretórios é recolhida. (para dizer isso de outra forma, cada arquivo é copiado para o diretório raiz do bucket)

O comando que eu uso é:

aws s3 cp --recursive ./logdata/ s3://bucketname/

Eu também tentei deixar de lado a barra da minha designação de fonte (isto é, a cópia do argumento). Eu também usei um curinga para designar todos os arquivos ... cada coisa que tento simplesmente copia os arquivos de log para o diretório raiz do intervalo.

    
por agentv 14.04.2015 / 23:54

6 respostas

25

Acredito que a sincronização é o método que você deseja. Tente isso:

aws s3 sync ./logdata s3://bucketname/
    
por 15.04.2015 / 00:52
7

Eu havia enfrentado este erro ao usar um desses comandos.

$ aws s3 cp --recursive /local/dir s3://s3bucket/
OR
$ aws s3 sync /local/dir s3://s3bucket/

Eu até pensei em montar o bucket do S3 localmente e depois rodar o rsync, mesmo que tenha falhado (ou fiquei pendurado por algumas horas) já que tenho milhares de arquivos.

Finalmente, o s3cmd funcionou como um encanto.

s3cmd sync /local/dir/ --delete-removed s3://s3bucket/ --exclude="some_file" --exclude="*directory*"  --progress --no-preserve

Isso não apenas faz o trabalho bem e mostra uma saída bastante detalhada no console, mas também carrega arquivos grandes em partes.

    
por 29.09.2015 / 05:58
3

O seguinte funcionou para mim:

aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive

O AWS irá "fazer" this_directory e copiar todo o conteúdo local para ele.

    
por 20.12.2017 / 19:56
2

Use o seguinte script para copiar a estrutura de pastas:

s3Folder="s3://xyz.abc.com/asdf";

for entry in "$asset_directory"*
do
    echo "Processing - $entry"
    if [[ -d  $entry ]]; then
        echo "directory"
        aws s3 cp  --recursive "./$entry" "$s3Folder/$entry/"
    else
        echo "file"
        aws s3 cp "./$entry" "$s3Folder/"
    fi
done
    
por 17.11.2016 / 12:26
1

Como alternativa, você também pode tentar o minio client, também conhecido como mc

$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/

Espero que ajude.

PS: Eu sou um dos contribuintes do projeto.

    
por 04.01.2016 / 10:06
1

Não consegui obter s3 sync ou s3 cp para trabalhar em uma pasta de 55 GB com milhares de arquivos e mais de duas dúzias de subdiretórios dentro dele. Tentar sincronizar a pasta inteira só faria com que o awscli falhasse silenciosamente sem fazer upload de nada para o intervalo.

Acabou fazendo isso para primeiro sincronizar todos os subdiretórios e seus conteúdos (a estrutura de pastas é preservada):

nice find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | while read line; do aws s3 sync $"$line" "s3://bucketname/$line"; done

Então eu fiz isso para obter os 30.000 arquivos no nível superior:

nice find . -mindepth 1 -maxdepth 1 -type f | cut -c 3- | while read line; do aws s3 cp "$line" "s3://bucketname/";

Certifique-se de observar a carga no servidor (protip que você pode usar w para mostrar apenas a carga) e ctrl-z para suspender o comando se a carga ficar muito alta. ( fg para continuar de novo).

Colocando isso aqui no caso de ajudar alguém em uma situação semelhante.

Notas:

-mindepth 1 exclui .

-maxdepth 1 impede o achado de listar o conteúdo dos subdiretórios, pois s3 sync os manipula com êxito.

cut -c 3- remove o "./" do início de cada resultado da pesquisa.

    
por 24.10.2018 / 21:27