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

39

Desejo usar o AWS S3 CLI para copiar uma estrutura de diretório completa para um bucket do S3.

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

O comando que eu uso é:

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

Eu também tentei deixar de fora a barra à direita na minha designação de origem (ou seja, a cópia do argumento). Também usei um curinga para designar todos os arquivos ... cada coisa que tento simplesmente copia os arquivos de log no diretório raiz do bucket.

agentv
fonte
3
Sim! Essa é definitivamente a resposta. Diferente do Unix, o comando cp (e o comando sync) não cria um diretório de destino no lado do destino, a menos que você solicite. Portanto, se você aws s3 cp --recursive mylocalsrcdir s3://bucket/simplesmente colocar os arquivos em seu repositório local no bucket "diretório raiz". Se você o fizer aws s3 cp --recursive mydirectory s3://bucket/mydirectory, ele recriará a estrutura de diretórios no final do destino.
agentv

Respostas:

38

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

aws s3 sync ./logdata s3://bucketname/
Chad Smith
fonte
4
... Fiquei empolgado em tentar isso, mas ele me deu os mesmos resultados que o comando cp. Os arquivos do meu diretório ./logfiles foram copiados para o "diretório" raiz no bucket. Uma coisa que funcionou foi tentar isso: aws s3 sync ./logdata s3://bucketname/logdata Obrigado pela liderança. --- v
agentv
infelizmente, mesmo com seu agente de sugestões, obtive o mesmo resultado, a sincronização não preservou a estrutura de diretórios e apenas achatou tudo.
Niharvey
ACTUALIZAÇÃO * - estrutura Nevermind meu diretório ficou confuso em no extrato
niharvey
9

Eu havia enfrentado esse 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 S3 localmente e depois executar o rsync, mesmo que tenha falhado (ou travado por algumas horas), pois 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 funciona bem e mostra uma saída bastante detalhada no console, mas também carrega arquivos grandes em partes.

vikas027
fonte
11
tl; dr: o globbing do arquivo curinga funcionou melhor em s3cmd para mim. Por mais legal que o aws-cli seja - para o meu problema de manipulação de arquivos S3 que não funcionou imediatamente como eu esperava e pensei que fosse -, acabei instalando e usando o s3cmd. Qualquer que seja a sintaxe e o trabalho por trás das cenas que eu imaginei conceitualmente, o s3cmd foi mais intuitivo e acolhedor para os meus pré-conceitos. Talvez não seja a resposta que você veio aqui, mas funcionou para mim.
precisa saber é o seguinte
Isso é útil @ BradChesney79
agentv
Seria bom descrever as opções que você está usando no comando sync. Também não existe um comando "cp" para o s3cmd? por que usar sincronização em vez de cp?
VinGarcia 03/04
4

O seguinte funcionou para mim:

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

A AWS "cria" this_directorye copia todo o conteúdo local para ele.

Michael Silverstein
fonte
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
Shishir Arora
fonte
2

Não consegui obter s3 syncou s3 cptrabalhar em uma pasta de 55 GB com milhares de arquivos e mais de duas dúzias de subdiretórios. Tentar sincronizar a pasta inteira causaria uma falha silenciosa do awscli sem fazer upload de nada para o bucket.

Acabamos fazendo isso para sincronizar primeiro todos os subdiretórios e seu conteúdo (a estrutura da pasta é preservada):

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

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/";

Observe a carga no servidor (protip que você pode usar wpara apenas mostrar a carga) e ctrl-zsuspenda o comando se a carga ficar muito alta. ( fgpara continuar novamente).

Colocar isso aqui, caso ajude alguém em uma situação semelhante.

Notas:

-mindepth 1 exclui .

-maxdepth 1impede a localização de listar o conteúdo dos subdiretórios, pois s3 synctrata-os com êxito.

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

twhitney
fonte
1

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

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

Espero que ajude.

PS: Eu sou um dos colaboradores do projeto.

koolhead17
fonte
11
Crédito onde o crédito é devido: mc fez o trabalho e preservou a estrutura de diretórios - incrível! Eu já estava puto para instalar> 200 megabytes de Python & Pip porcaria para usar awscli e ler aqui que entra em colapso a estrutura dir ..
joonas.fi
0

(Melhorando a solução de Shishir )

  • Salve o seguinte script em um arquivo (eu o nomeei s3Copy.sh)
path=$1 # the path of the directory where the files and directories that need to be copied are located
s3Dir=$2 # the s3 bucket path

for entry in "$path"/*; do
    name=`echo $entry | sed 's/.*\///'`  # getting the name of the file or directory
    if [[ -d  $entry ]]; then  # if it is a directory
        aws s3 cp  --recursive "$name" "$s3Dir/$name/"
    else  # if it is a file
        aws s3 cp "$name" "$s3Dir/"
    fi
done
  • Execute-o da seguinte maneira:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Por exemplo, se s3Copy.shestiver armazenado no diretório inicial e desejar copiar todos os arquivos e diretórios localizados no diretório atual, execute o seguinte procedimento:
    ~/s3Copy.sh . s3://XXX/myBucket

Você pode facilmente modificar o script para permitir a outros argumentos s3 cp, tais como --include, --exclude...

LoMaPh
fonte
Isso é incrível. Artesanal, de fato.
agentv 6/02