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


40

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

Jusqu'ici, tout ce que j'ai essayé copie les fichiers dans le compartiment, mais la structure des répertoires est réduite. (Pour le dire autrement, chaque fichier est copié dans le répertoire racine du compartiment)

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.-à-d. 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.


3
Oui! C'est définitivement la réponse. Contrairement à Unix, la commande cp (et la commande sync) ne crée 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/placez simplement les fichiers de votre référentiel local dans le compartiment "répertoire racine", le cas échéant, aws s3 cp --recursive mydirectory s3://bucket/mydirectoryla structure de répertoires sera recréée à la fin de la cible.
agent

Réponses:


39

Je crois que la synchronisation est la méthode que vous voulez. Essayez ceci à la place:

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

4
... J'étais impatient 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 compartiment. Une chose qui a bien fonctionné a été d'essayer ceci: aws s3 sync ./logdata s3://bucketname/logdata Merci pour le rôle principal. --- v
agent

Malheureusement, même avec votre conseiller, j'ai obtenu le même résultat. La synchronisation n'a pas préservé la structure des répertoires et a tout mis à plat.
niharvey

UPDATE * - tant pis, la structure de mon répertoire a été gâchée par l'extrait
niharvey le

9

J'avais fait face à cette erreur en utilisant 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 si cela a échoué (ou été bloqué pendant quelques heures) car j'ai des milliers de fichiers.

Enfin, s3cmd a fonctionné comme un charme.

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

Cela non seulement fait le travail correctement et affiche une sortie assez prolixe sur la console, mais télécharge également de gros fichiers par parties.


1
tl; dr: la suppression du fichier de carte générique fonctionnait mieux dans s3cmd pour moi. Aussi cool qu'aws-cli soit - pour mon unique problème de manipulation de fichiers S3 qui ne fonctionnait pas immédiatement comme je l'espérais et pensais qu'il le pourrait - j'ai fini par installer et utiliser s3cmd. Quelles que soient la syntaxe et les coulisses que j’ai imaginées conceptuellement, s3cmd était plus intuitif et plus accommodant avec mes idées préconçues. Ce n’est peut-être pas la réponse pour laquelle vous êtes venu ici, mais cela a fonctionné pour moi.
BradChesney79

Cela est utile @ BradChesney79
agentv

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

4

Ce qui suit a fonctionné pour moi:

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

AWS va ensuite "créer" this_directoryet copier tout le contenu local dans celui-ci.


2

Utilisez le script suivant pour copier la structure de dossier:

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

Je n'ai pas pu s3 sync ou s3 cptravailler sur un dossier de 55 Go contenant des milliers de fichiers et plus de 2 douzaines de sous-répertoires. Essayer de synchroniser tout le dossier ferait simplement échouer awscli sans rien télécharger dans le compartiment.

En fin de compte, nous avons d'abord synchronisé 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 ceci 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 (protip que vous pouvez utiliser wpour afficher uniquement la charge) etctrl-z à suspendre la commande si la charge devient trop élevée. ( fgpour le continuer à nouveau).

Mettre ceci ici au cas où cela pourrait aider quelqu'un dans une situation similaire.

Remarques:

-mindepth 1 exclut .

-maxdepth 1empêche find de lister le contenu des sous-répertoires, car s3 syncgère ceux-ci avec succès.

cut -c 3- supprime le "./" du début de chaque résultat de find.


1

Sinon, vous pouvez aussi essayer minio client aka mc

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

J'espère que ça vous aidera.

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


1
Crédit pour le crédit dû: mc a fait le travail et a préservé la structure du répertoire - génial! J'étais déjà énervé d'installer> 200 Mo de merde Python & Pip d'utiliser awscli et de lire ici qu'il
effondrait la

0

(Améliorer 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.shest stocké dans le répertoire de base et que je souhaite copier tous les fichiers et répertoires situés dans le répertoire actuel, je lance ceci:
    ~/s3Copy.sh . s3://XXX/myBucket

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


C'est étonnant. Artisanal, en fait.
agent le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.