Kopieren Sie die Verzeichnisstruktur intakt in den AWS S3-Bucket


38

Ich möchte die AWS S3-CLI verwenden, um eine vollständige Verzeichnisstruktur in einen S3-Bucket zu kopieren.

Bisher hat alles, was ich versucht habe, die Dateien in den Bucket kopiert, aber die Verzeichnisstruktur ist reduziert. (Anders ausgedrückt, jede Datei wird in das Stammverzeichnis des Buckets kopiert.)

Der Befehl, den ich benutze, ist:

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

Ich habe auch versucht, den abschließenden Schrägstrich auf meiner Quellenbezeichnung (dh die Kopie aus dem Argument) wegzulassen. Ich habe auch einen Platzhalter verwendet, um alle Dateien zu kennzeichnen. Bei jedem Versuch werden die Protokolldateien einfach in das Stammverzeichnis des Buckets kopiert.


3
Ja! Das ist definitiv die Antwort. Im Gegensatz zu Unix erstellen der Befehl cp (und der Befehl sync) kein Zielverzeichnis auf der Zielseite, es sei denn, Sie fordern sie dazu auf. Also , wenn Sie aws s3 cp --recursive mylocalsrcdir s3://bucket/dann wird es einfach auszudrücken , die Dateien in Ihrem lokalen Repository auf dem heißen Stein „root directory“ Wenn Sie aws s3 cp --recursive mydirectory s3://bucket/mydirectorydann wird es die Verzeichnisstruktur auf dem Zielende neu zu erstellen.
Agentv

Antworten:


37

Ich glaube, Synchronisierung ist die Methode, die Sie wollen. Versuchen Sie dies stattdessen:

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

4
Ich war aufgeregt, das zu versuchen, aber es gab mir die gleichen Ergebnisse wie der Befehl cp. Die Dateien aus meinem ./logfiles-Verzeichnis wurden in das Stammverzeichnis im Bucket kopiert. Eine Sache, die jedoch funktioniert hat, war, dies zu versuchen: aws s3 sync ./logdata s3://bucketname/logdata Danke für die Führung. --- v
agentv

leider habe ich auch mit ihrem vorschlag agentv das selbe ergebnis erzielt sync hat die verzeichnisstruktur nicht erhalten und einfach alles abgeflacht.
Niharvey

UPDATE * - vergiss, dass meine Verzeichnisstruktur beim Auszug
durcheinander geraten ist

9

Ich hatte diesen Fehler festgestellt, als ich einen dieser Befehle verwendet habe.

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

Ich dachte sogar daran, den S3-Bucket lokal zu mounten und dann rsync auszuführen, auch wenn dies fehlschlug (oder für einige Stunden zum Erliegen kam), da ich Tausende von Dateien habe.

Schließlich wirkte s3cmd wie ein Zauber.

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

Dies macht nicht nur die Arbeit gut und zeigt eine ziemlich ausführliche Ausgabe auf der Konsole, sondern lädt auch große Dateien in Teilen hoch.


1
tl; dr: wild card file globbing hat in s3cmd bei mir besser funktioniert. So cool wie aws-cli ist - für mein einmaliges S3-Dateimanipulationsproblem, das nicht sofort so funktioniert hat, wie ich es mir erhofft und gedacht habe -, habe ich schließlich s3cmd installiert und verwendet. Unabhängig von der Syntax und der Arbeit hinter den Kulissen, die ich mir konzeptionell vorgestellt habe, war s3cmd intuitiver und passte sich meinen Vorurteilen an. Vielleicht ist es nicht die Antwort, für die Sie hergekommen sind, aber es hat für mich funktioniert.
BradChesney79

Das ist nützlich @ BradChesney79
agentv

Es wäre gut, die Optionen zu beschreiben, die Sie für den Befehl sync verwenden. Auch gibt es keinen "cp" -Befehl für die s3cmd? Warum Sync anstelle von CP verwenden?
VinGarcia

4

Folgendes hat für mich funktioniert:

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

AWS "erstellt" dann this_directoryalle lokalen Inhalte und kopiert sie hinein.


2

Verwenden Sie das folgende Skript zum Kopieren der Ordnerstruktur:

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

Ich konnte nicht bekommen s3 syncoder s3 cpinnen mit 55 GB - Ordner auf einen zu arbeiten Tausenden von Dateien und mehr als 2 Dutzend Verzeichnissen. Der Versuch, den gesamten Ordner zu synchronisieren, würde dazu führen, dass awscli unbemerkt fehlschlägt, ohne dass etwas in den Bucket hochgeladen wird.

Dies wurde getan, um zuerst alle Unterverzeichnisse und deren Inhalte zu synchronisieren (die Ordnerstruktur bleibt erhalten):

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

Dann habe ich dies getan, um die 30.000 Dateien in der obersten Ebene zu erhalten:

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

Stellen Sie sicher, dass Sie die Last auf dem Server beobachten (Protip, mit dem Sie wnur die Last anzeigen können ) und ctrl-zden Befehl anhalten, wenn die Last zu hoch wird. ( fgum es wieder fortzusetzen).

Stellen Sie dies hier auf, falls es jemandem in einer ähnlichen Situation hilft.

Anmerkungen:

-mindepth 1 schließt aus .

-maxdepth 1Verhindert, dass find Inhalte von Unterverzeichnissen auflistet, da s3 syncdiese erfolgreich verarbeitet werden.

cut -c 3- Entfernt das "./" vom Anfang jedes Ergebnisses aus der Suche.


1

Alternativ können Sie auch den Minio-Client aka mc ausprobieren

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

Hoffe es hilft.

PS: Ich bin einer der Mitwirkenden am Projekt.


1
Kredit wo Kredit fällig ist: mc hat den Job gemacht und dir Struktur bewahrt - genial! Ich war schon sauer,> 200 Megabyte Python & Pip-Mist zu installieren, um awscli zu verwenden und hier zu lesen, dass es die dir-Struktur zusammenbricht.
joonas.fi

0

(Verbesserung der Lösung von Shishir )

  • Speichere das folgende Skript in einer Datei (ich habe die Datei benannt 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
  • Führen Sie es wie folgt aus:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Wenn beispielsweise im Basisverzeichnis s3Copy.shgespeichert ist und ich alle Dateien und Verzeichnisse kopieren möchte, die sich im aktuellen Verzeichnis befinden, führe ich Folgendes aus:
    ~/s3Copy.sh . s3://XXX/myBucket

Sie können ganz einfach das Skript ändern , um andere Argumente zu ermöglichen , s3 cpwie --include, --exclude...


Das ist großartig. In der Tat handwerklich.
Agent
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.