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.
(Amélioration de la solution de Shishir )
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
/PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
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
, ...
Je pense que la synchronisation est la méthode que vous souhaitez. Essayez plutôt ceci:
aws s3 sync ./logdata s3://bucketname/
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.
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.
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.
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
Cela fonctionne pour moi .. aws s3 sync mydir s3: // rahuls-bucket/mydir
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.