Copia la struttura delle directory intatta nel bucket AWS S3


40

Voglio usare AWS S3 cli per copiare una struttura di directory completa in un bucket S3.

Finora, tutto ciò che ho provato copia i file nel bucket, ma la struttura della directory è compressa. (per dirlo in un altro modo, ogni file viene copiato nella directory principale del bucket)

Il comando che uso è:

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

Ho anche provato a lasciare la barra finale sulla mia designazione di origine (cioè la copia dall'argomento). Ho anche usato un carattere jolly per designare tutti i file ... ogni cosa che provo semplicemente copia i file di registro nella directory principale del bucket.


3
Sì! Questa è sicuramente la risposta. A differenza di Unix, il comando cp (e il comando sync) non creano una directory di destinazione sul lato di destinazione a meno che non venga richiesto loro di farlo. Quindi, se si aws s3 cp --recursive mylocalsrcdir s3://bucket/inserisce semplicemente i file nel repository locale nel bucket "directory principale" In tal aws s3 cp --recursive mydirectory s3://bucket/mydirectorycaso, verrà ricreata la struttura della directory sul lato di destinazione.
agentv

Risposte:


39

Credo che la sincronizzazione sia il metodo che desideri. Prova questo invece:

aws s3 sync ./logdata s3://bucketname/

4
... Ero entusiasta di provarlo, ma mi ha dato gli stessi risultati del comando cp. I file dalla mia directory ./logfiles sono stati copiati nella "directory" radice nel bucket. Una cosa che ha funzionato è stata provare questo: aws s3 sync ./logdata s3://bucketname/logdata grazie per il vantaggio. --- v
agentv

sfortunatamente, anche con il tuo suggerimento agente, ho ottenuto lo stesso risultato. La sincronizzazione non ha preservato la struttura della directory e ha semplicemente appiattito tutto.
Niharvey,

AGGIORNAMENTO * - non importa che la mia struttura di directory sia stata incasinata sull'estratto
niharvey,

9

Ho riscontrato questo errore durante l'utilizzo di uno di questi comandi.

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

Ho anche pensato di montare il bucket S3 localmente e quindi eseguire rsync, anche questo non è riuscito (o si è bloccato per alcune ore) poiché ho migliaia di file.

Infine, s3cmd ha funzionato come un fascino.

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

Questo non solo fa bene il lavoro e mostra un output piuttosto dettagliato sulla console, ma carica anche file di grandi dimensioni in parti.


1
tl; dr: il globbing di file jolly ha funzionato meglio in s3cmd per me. Fresco quanto aws-cli è - per il mio problema di manipolazione dei file S3 che una volta non funzionava immediatamente come speravo e pensavo potesse - ho finito per installare e usare s3cmd. Qualunque sintassi e dietro le quinte funzionino, immaginavo concettualmente, s3cmd era più intuitivo e comprensivo dei miei preconcetti. Forse non è la risposta per cui sei venuto qui, ma ha funzionato per me.
BradChesney79

Questo è utile @ BradChesney79
agentv

Sarebbe utile descrivere le opzioni che stai usando sul comando di sincronizzazione. Inoltre non esiste un comando "cp" per s3cmd? perché usare sync invece di cp?
VinGarcia,

4

Per me ha funzionato:

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

AWS "creerà" this_directorye copierà in esso tutti i contenuti locali.


2

Utilizzare il seguente script per copiare la struttura delle cartelle:

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

2

Non sono riuscito a trovare s3 synco s3 cplavorare su una cartella da 55 GB con migliaia di file e oltre 2 dozzine di sottodirectory all'interno. Cercare di sincronizzare l'intera cartella causerebbe il fallimento silenzioso di awscli senza caricare nulla sul bucket.

Ho finito per fare questo per sincronizzare prima tutte le sottodirectory e il loro contenuto (la struttura delle cartelle è preservata):

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

Quindi l'ho fatto per ottenere i 30.000 file al livello superiore:

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

Assicurati di guardare il carico sul server (protip puoi usare wsolo per mostrare il carico) e ctrl-zdi sospendere il comando se il carico diventa troppo alto. ( fgper continuare di nuovo).

Mettendolo qui nel caso aiuti qualcuno in una situazione simile.

Gli appunti:

-mindepth 1 esclude .

-maxdepth 1impedisce a find di elencare i contenuti delle sottodirectory, poiché li s3 syncgestisce correttamente.

cut -c 3- rimuove "./" dall'inizio di ogni risultato da find.


1

In alternativa, puoi anche provare Minio Client aka Mc

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

Spero che sia d'aiuto.

PS: sono uno dei collaboratori del progetto.


1
Credito dove il credito è dovuto: mc ha fatto il lavoro e ha conservato la struttura del dir - fantastico! Ero già incazzato per installare> 200 megabyte di merda Python & Pip per usare awscli e leggere qui che fa crollare la struttura del dir ..
joonas.fi

0

(Migliorare la soluzione di Shishir )

  • Salva il seguente script in un file (ho chiamato il file 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
  • Eseguilo come segue:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Ad esempio, se s3Copy.shè archiviato nella home directory e voglio copiare tutti i file e le directory che si trovano nella directory corrente, quindi eseguo questo:
    ~/s3Copy.sh . s3://XXX/myBucket

Si può facilmente modificare lo script per consentire altri argomenti di s3 cpcome --include, --exclude, ...


È fantastico. Artigianale, infatti.
agentv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.