85 votes

Copier la structure de répertoire intacte dans le bucket AWS S3

Je veux utiliser le AWS S3 cli pour copier une structure de répertoire complète dans un bucket S3.

Jusqu'à présent, tout ce que j'ai essayé copie les fichiers dans le seau, mais la structure du répertoire est effondrée. (pour le dire autrement, chaque fichier est copié dans le répertoire racine du seau)

La commande que j'utilise est :

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

J'ai aussi essayé de laisser de côté le slash de fin sur ma désignation source (c'est-à-dire, l'argument de copie depuis). J'ai aussi utilisé un joker pour désigner tous les fichiers ... chaque chose que j'essaie copie simplement les fichiers journaux dans le répertoire racine du seau.

7 votes

Oui ! C'est certainement la réponse. Contrairement à Unix, la commande cp (et la commande sync) ne créent pas de répertoire cible du côté destination à moins que vous ne leur demandiez de le faire. Donc si vous aws s3 cp --recursive mylocalsrcdir s3://bucket/ alors il va simplement mettre les fichiers de votre dépôt local dans le "répertoire racine" du bucket. Si vous faites aws s3 cp --recursive mydirectory s3://bucket/mydirectory alors il recréera la structure des répertoires à l'extrémité cible.

97voto

Chad Smith Points 1359

Je crois que sync est la méthode que vous voulez. Essayez plutôt ceci :

aws s3 synchroniser . /logdata s3://bucketname/

11 votes

...J'étais excité d'essayer cela, mais cela m'a donné les mêmes résultats que la commande cp. Les fichiers de mon répertoire ./logfiles ont été copiés dans le "répertoire" racine du bucket. Une chose qui a toutefois fonctionné était d'essayer ceci : aws s3 sync ./logdata s3://bucketname/logdata Merci pour le conseil. ---v

0 votes

Malheureusement, même avec votre suggestion , j'ai obtenu le même résultat : la synchronisation n'a pas conservé la structure des répertoires et a simplement tout aplani.

1 votes

MISE À JOUR* - Peu importe, ma structure de répertoire a été perturbée lors de l'extraction.

38voto

La suite a fonctionné pour moi :

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

AWS va alors "créer" this_directory et copier tous les contenus locaux dedans.

17voto

H Dog Points 2055

J'avais rencontré cette erreur en utilisant l'une de ces commandes.

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

J'ai même envisagé de monter le bucket S3 localement puis d'exécuter rsync, mais cela a échoué (ou est resté bloqué pendant quelques heures) car j'ai des milliers de fichiers.

Finalement, s3cmd a fonctionné à merveille.

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

Non seulement cela fonctionne bien et affiche une sortie assez verbeuse sur la console, mais cela permet également de téléverser de gros fichiers en parties.

1 votes

Tl;dr: L'ombrage de fichier générique de carte sauvage a mieux fonctionné dans s3cmd pour moi. Aussi cool qu'aws-cli soit --pour mon problème de manipulation de fichier S3 ponctuel qui n'a pas fonctionné immédiatement comme je l'espérais et le pensais-- j'ai fini par installer et utiliser s3cmd. Quelle que soit la syntaxe et le travail en arrière-plan que j'imaginais conceptuellement, s3cmd était plus intuitif et accommodant à mes préconceptions intégrées. Peut-être que ce n'est pas la réponse que vous êtes venu chercher, mais ça a marché pour moi.

0 votes

C'est utile @BradChesney79

0 votes

Il serait bon de décrire les options que vous utilisez sur la commande de synchronisation. De plus, il n'y a pas de commande "cp" pour le s3cmd ? Pourquoi utiliser sync au lieu de cp ?

7voto

LoMaPh Points 164

(Amélioration de la solution de Shishir)

  • Enregistrez le script suivant dans un fichier (j'ai nommé le fichier s3Copy.sh)

    path=$1 # le chemin du répertoire où se trouvent les fichiers et répertoires à copier s3Dir=$2 # le chemin du bucket s3

    for entry in "$path"/; do name=`echo $entry | sed 's/.\///'` # obtenir le nom du fichier ou répertoire if [[ -d $entry ]]; then # s'il s'agit d'un répertoire aws s3 cp --recursive "$name" "$s3Dir/$name/" else # s'il s'agit d'un fichier aws s3 cp "$name" "$s3Dir/" fi done

  • Exécutez-le comme suit :
    /CHEMIN/VERS/s3Copy.sh /CHEMIN/VERS/RÉPERTOIRE/RACINE/DES/FICHIERSetRÉPERTOIRES CHEMIN/VERS/BUCKET/S3
    Par exemple, si s3Copy.sh est stocké dans le répertoire personnel et que je veux copier tous les fichiers et répertoires situés dans le répertoire actuel, alors j'exécute ceci :
    ~/s3Copy.sh . s3://XXX/monBucket

Vous pouvez facilement modifier le script pour permettre d'autres arguments de s3 cp tels que --include, --exclude, ...

0 votes

Indice : si vous avez l'habitude de #!/bin/sh en haut de vos scripts, changez vers #!/bin/bash celui-ci. Le [[ ]] est ajouté en bash : stackoverflow.com/a/3427931/509907

3voto

narra_kk Points 13

Utilisez le script suivant pour copier la structure du dossier:

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

pour entrée dans "$asset_directory"*
faire
    echo "En cours de traitement - $entry"
    si [[ -d  $entry ]]; then
        echo "dossier"
        aws s3 cp  --recursive "./$entry" "$s3Folder/$entry/"
    sinon
        echo "fichier"
        aws s3 cp "./$entry" "$s3Folder/"
    fi
fait

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X