Frage Kopieren Sie die Verzeichnisstruktur intakt in den AWS S3-Bucket


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

Bis jetzt kopiert alles, was ich versucht habe, die Dateien in den Bucket, aber die Verzeichnisstruktur ist kollabiert. (Um es anders auszudrücken, jede Datei wird in das Stammverzeichnis des Buckets kopiert)

Der Befehl, den ich verwende, ist:

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

Ich habe auch versucht, den abschließenden Schrägstrich auf meiner Quellenbezeichnung (dh die Kopie von Argument) zu verlassen. Ich habe auch einen Platzhalter verwendet, um alle Dateien zu bezeichnen ... jede Sache, die ich versuche, kopiert einfach die Protokolldateien in das Stammverzeichnis des Buckets.


23
2018-04-14 21:54


Ursprung


Ja! Das ist definitiv die Antwort. Im Gegensatz zu Unix erstellt der Befehl cp (und der Befehl sync) auf der Zielseite kein Zielverzeichnis, es sei denn, Sie werden dazu aufgefordert. Also wenn du aws s3 cp --recursive mylocalsrcdir s3://bucket/ dann wird es einfach die Dateien in Ihrem lokalen Repository in den Bucket "root-Verzeichnis" setzen, wenn Sie das tun aws s3 cp --recursive mydirectory s3://bucket/mydirectory dann wird die Verzeichnisstruktur am Zielende neu erstellt. - agentv


Antworten:


Ich glaube, Sync ist die Methode, die Sie wollen. Versuchen Sie es stattdessen:

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

24
2018-04-14 22:52



... Ich war aufgeregt, das zu versuchen, aber es gab mir die gleichen Ergebnisse wie der CP-Befehl. Die Dateien aus dem Verzeichnis ./logfiles wurden in das Stammverzeichnis im Bucket kopiert. Eine Sache, die jedoch funktionierte, war dies zu versuchen: aws s3 sync ./logdata s3://bucketname/logdata  Danke für die Führung. --- v - agentv
leider, sogar mit ihrem vorschlag agentv ich habe das gleiche ergebnis sync nicht erhalten die verzeichnisstruktur und nur alles glatt gemacht. - niharvey
UPDATE * - vergiss, dass meine Verzeichnisstruktur in den Extrakt verwickelt wurde - niharvey


Ich hatte es gesehen diese Fehler bei der Verwendung eines dieser Befehle.

$ 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 laufen zu lassen, sogar das ist fehlgeschlagen (oder wurde für ein paar Stunden gehängt), da ich tausende von Dateien habe.

Endlich, s3cmd Lief wie am Schnürchen.

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

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


7
2017-09-29 03:58



tl; dr: Wildcard-Datei Globbing arbeitete besser in s3cmd für mich. So cool wie aws-cli ist - für mein einmaliges S3-Dateimanipulationsproblem, das nicht sofort funktionierte, wie ich es mir erhofft hätte und dachte, es könnte ... Ich habe s3cmd installiert und benutzt. Was auch immer Syntax und hinter den Kulissen funktioniert Ich dachte konzeptionell, s3cmd war intuitiver und entgegenkommender zu meinen vorgefassten Meinungen. Vielleicht ist es nicht die Antwort, für die du hierher gekommen bist, 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 sync-Befehl verwenden. Auch gibt es keinen "cp" -Befehl für die s3cmd? warum benutze sync statt cp? - VinGarcia


Folgendes funktionierte für mich:

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

AWS wird dann "machen" this_directory und kopieren Sie alle lokalen Inhalte hinein.


3
2017-12-20 18:56





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





Alternativ könntest du auch den minio client aka ausprobieren mc

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

Hoffe es hilft.

PS: Ich bin einer der Mitwirkenden für das Projekt.


1
2018-01-04 09:06



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


Ich konnte nicht bekommen s3 sync oder s3 cp Arbeiten an einem 55-GB-Ordner mit Tausenden von Dateien und über 2 Dutzend Unterverzeichnisse. Der Versuch, den gesamten Ordner zu synchronisieren, würde nur dazu führen, dass awscli automatisch fehlschlägt, ohne etwas in den Bucket hochzuladen.

Damit haben wir zuerst alle Unterverzeichnisse und deren Inhalt synchronisiert (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 das getan, um die 30.000 Dateien in der obersten Ebene zu bekommen:

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

Achten Sie darauf, die Last auf dem Server zu beobachten (protip können Sie verwenden w nur um die Last zu zeigen) und ctrl-z den Befehl anhalten, wenn die Last zu hoch wird. (fg um es wieder fortzusetzen).

Setzen Sie das hier für den Fall, dass es jemand in einer ähnlichen Situation hilft.

Anmerkungen:

-mindepth 1 schließt aus .

-maxdepth 1 verhindert, dass find den Inhalt von Unterverzeichnissen auflistet, da s3 sync handhabt diese erfolgreich.

cut -c 3- Entfernt das "./" vom Anfang jedes Ergebnisses von find.


0
2017-10-24 19:27