web-dev-qa-db-fra.com

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

Je souhaite utiliser la cli AWS S3 pour copier une structure de répertoires complète dans un compartiment S3.

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

La commande que j'utilise est:

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

J'ai également essayé de laisser la barre oblique de fin sur ma désignation de source (c'est-à-dire la copie de l'argument). J'ai également utilisé un caractère générique pour désigner tous les fichiers ... chaque chose que j'essaie copie simplement les fichiers journaux dans le répertoire racine du compartiment.

45
agentv

(Amélioration de la solution de Shishir )

  • Enregistrez le script suivant dans un fichier (j'ai nommé le fichier 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
  • Exécutez-le comme suit:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Par exemple, si s3Copy.sh est stocké dans le répertoire personnel et je veux copier tous les fichiers et répertoires situés dans le répertoire courant, puis je lance ceci:
    ~/s3Copy.sh . s3://XXX/myBucket

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

1
LoMaPh

Je pense que la synchronisation est la méthode que vous souhaitez. Essayez plutôt ceci:

aws s3 sync ./logdata s3://bucketname/
48
Chad Smith

J'avais rencontré une erreur this lors de l'utilisation de l'une de ces commandes.

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

J'ai même pensé à monter le compartiment S3 localement, puis à exécuter rsync, même cela a échoué (ou s'est bloqué pendant quelques heures) car j'ai des milliers de fichiers.

Enfin, s3cmd fonctionnait comme un charme.

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

Cela fait non seulement bien le travail et affiche une sortie assez verbeuse sur la console, mais télécharge également de gros fichiers en plusieurs parties.

10
vikas027

Ce qui suit a fonctionné pour moi:

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

AWS va alors "faire" this_directory et y copier tout le contenu local.

6
Michael Silverstein

Je n'ai pas pu s3 sync ou s3 cp pour travailler sur un dossier de 55 Go avec des milliers de fichiers et plus de 2 douzaines de sous-répertoires à l'intérieur. Essayer de synchroniser tout le dossier entraînerait l'échec silencieux de awscli sans rien télécharger dans le compartiment.

J'ai fini par faire cela pour synchroniser d'abord tous les sous-répertoires et leur contenu (la structure des dossiers est préservée):

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

Ensuite, j'ai fait cela pour obtenir les 30 000 fichiers au niveau supérieur:

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

Assurez-vous de surveiller la charge sur le serveur (vous pouvez utiliser protip w pour afficher simplement la charge) et ctrl-z pour suspendre la commande si la charge devient trop élevée. (fg pour continuer).

Mettre cela ici au cas où cela aiderait quelqu'un dans une situation similaire.

Remarques:

-mindepth 1 exclut .

-maxdepth 1 empêche la recherche de répertorier le contenu des sous-répertoires, car s3 sync les gère avec succès.

cut -c 3- supprime le "./" au début de chaque résultat de la recherche.

3
twhitney

Utilisez le script suivant pour copier la structure des dossiers:

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
Shishir Arora

Cela fonctionne pour moi .. aws s3 sync mydir s3: // rahuls-bucket/mydir

1
brahul

Alternativement, vous pouvez également essayer le client minio aka mc

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

J'espère que cela vous aidera.

PS: Je suis l'un des contributeurs au projet.

1
koolhead17