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


Je souhaite utiliser AWS S3 cli 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 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.


23
2018-04-14 21:54


origine


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 tu aws s3 cp --recursive mylocalsrcdir s3://bucket/ alors il faudra simplement mettre les fichiers de votre référentiel local dans le compartiment "répertoire racine" Si vous le faites aws s3 cp --recursive mydirectory s3://bucket/mydirectory ensuite, il va recréer la structure de répertoires à la cible. - agentv


Réponses:


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

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

24
2018-04-14 22:52



... J'étais enthousiaste à l'idée 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é était d'essayer ceci: aws s3 sync ./logdata s3://bucketname/logdata  Merci pour le plomb. --- v - agentv
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 effacé. - niharvey
UPDATE * - tant pis, la structure de mon répertoire a été gâchée par l'extrait - niharvey


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

Finalement, s3cmd travaillé 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.


7
2017-09-29 03:58



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 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
C'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


Ce qui suit a fonctionné pour moi:

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

AWS va alors "faire" this_directory et copiez tout le contenu local dans celui-ci.


3
2017-12-20 18:56





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
2017-11-17 11:26





Sinon, 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 ça vous aidera.

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


1
2018-01-04 09:06



Crédit où le crédit est dû: mc a fait le travail et a préservé la structure de dir - 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 structure du répertoire. - joonas.fi


Je n'ai pas pu s3 sync ou s3 cp travailler 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, vous pouvez utiliser w juste montrer la charge) et ctrl-z pour suspendre la commande si la charge devient trop élevée. (fg continuer encore).

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

Remarques:

-mindepth 1 exclut .

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

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


0
2017-10-24 19:27