Angenommen, ich habe einen S3-Bucket namens x.y.z
In diesem Eimer habe ich Hunderte von Dateien. Ich möchte aber nur 2 Dateien mit dem Namen purple.gif
und worksheet.xlsx
löschen.
Kann ich dies vom AWS-Befehlszeilentool aus mit einem einzigen Aufruf von rm
ausführen?
Das hat nicht funktioniert:
$ aws s3 rm s3://x.y.z/worksheet.xlsx s3://x.y.z/purple.gif
Unknown options: s3://x.y.z/purple.gif
In manual scheint es nicht so, als könnten Sie eine Liste von Dateien explizit nach Namen löschen. Kennt jemand einen Weg, es zu tun? Ich ziehe es vor, das --recursive
-Flag nicht zu verwenden.
Sie können s3 rm
nicht verwenden, aber s3api delete-objects
:
aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
Sie können dies tun, indem Sie ein Argument --exclude
oder --include
mehrmals angeben. Damit dies funktioniert, müssen Sie jedoch --recursive
verwenden.
Beachten Sie bei mehreren Filtern, dass die Reihenfolge der Filterparameter wichtig ist. Die Regel ist, dass die Filter, die später im Befehl angezeigt werden, Vorrang vor den Filtern haben, die zuvor im Befehl angezeigt wurden.
aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"
Hier werden alle Dateien mit Ausnahme von purple.gif und worksheet.xlsx vom Befehl ausgeschlossen.
NIX WILDCARDS MIT AWS S3 (AWS CLI) VERWENDEN
Derzeit bietet AWS CLI keine Unterstützung für UNIX-Platzhalter im Argument "Pfad" eines Befehls. Es ist jedoch recht einfach, diese Funktionalität mit den Parametern --exclude und --include zu replizieren, die für mehrere aws s3-Befehle verfügbar sind.
Die verfügbaren Platzhalter sind:
"*" - Stimmt mit allem überein
"?" - Stimmt mit einem einzelnen Zeichen überein
"[]" - Stimmt mit einem einzelnen Zeichen in Klammern überein
"[!]" - Stimmt mit einem einzelnen Zeichen überein, das nicht in Klammern steht
Ein paar Dinge, die Sie bei der Verwendung von - include und - exclude mit dem Befehl aws s3 beachten sollten:
Sie können eine beliebige Anzahl von - include und - exclude Parametern verwenden.
Später übergebene Parameter haben Vorrang vor früher übergebenen Parametern (im selben Befehl).
Alle Dateien und Objekte sind standardmäßig "enthalten". Um also nur bestimmte Dateien einzuschließen, müssen Sie "ausschließen" und dann "einschließen". --recursive muss in Verbindung mit - include und - exclude verwendet werden, da sonst nur einzelne Datei-/Objektoperationen ausgeführt werden.
Beispiele: Kopieren Sie alle Dateien aus dem Arbeitsverzeichnis in den Big-Datums-Bucket:
aws s3 cp ./ s3://big-datums/ --recursive
Löschen Sie alle ".Java" -Dateien aus dem Big-Datums-Bucket:
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.Java"
Löschen Sie alle Dateien im Big-Datums-Bucket mit einer Dateierweiterung, die mit "j" oder "c" beginnt (".csv", ".Java", ".json", "jpeg" usw.):
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.[jc]*"
Kopieren Sie ".txt" - und ".csv" -Dateien aus dem S3-Bucket für große Datenmengen in das lokale Arbeitsverzeichnis:
aws s3 cp s3://big-datums/ . --recursive --exclude "*" --include "*.txt" --include "*.csv"
#Copy all files from working directory to the big-datums bucket:
aws s3 cp ./ s3://big-datums/ --recursive
#Delete all ".Java" files from the big-datums bucket:
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.Java"
#Delete all files in the big-datums bucket with a file extension beginning with "j" or "c" (".csv", ".Java, ".json", ."jpeg", etc.):
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.[jc]*"
#Copy ".txt" and ".csv" files from big-datums S3 bucket to local working directory:
aws s3 cp s3://big-datums/ . --recursive --exclude "*" --include "*.txt" --include "*.csv" ```
Ich fand dieses über die Befehlszeile nützlich. Ich hatte mehr als 4 Millionen Dateien und es dauerte fast eine Woche, bis der Eimer leer war. Dies ist praktisch, da die AWS-Konsole die Protokolle nicht beschreibt.
Hinweis: Sie müssen Jquery installiert haben
aws s3api list-object-versions --bucket YOUrBUCKEtNAMeHERe-processed --output json --query 'Versions[].[Key, VersionId]' | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' | xargs -L1 aws s3api delete-object --bucket YOUrBUCKEtNAMeHERe
Beachte das:
aws s3 rm s3://x.y.z/ --recursive --include "\*.gif"
entfernt alle Dateien im Pfad, einschließlich "\*.gif"
.
aws s3 rm s3://x.y.z/ --recursive --exclude "\*" --include "\*.gif"
entfernt nur Dateien, die mit "\*.gif"
übereinstimmen.
Diese Lösung funktioniert, wenn Sie einen Platzhalter für den Objektnamen angeben möchten.
aws s3 ls dmap-live-dwh-files/backup/mongodb/oms_api/hourly/ | grep order_2019_08_09_* | awk {'print "aws s3 rm s3://dmap-live-dwh-files/backup/mongodb/oms_api/hourly/" $4'} | bash
Anscheinend funktioniert aws s3 rm nur für einzelne Dateien/Objekte.
Unten ist ein Bash-Befehl, der mit etwas Erfolg funktioniert (etwas langsam, aber funktioniert):
aws s3 ls s3://bucketname/foldername/ |
awk {'print "aws s3 rm s3://bucketname/foldername/" $4'} |
bash
Beachten Sie, dass Probleme auftreten können, wenn die Objektnamen Leerzeichen oder lustige Zeichen enthalten. Dies liegt daran, dass der Befehl "aws s3 ls" solche Objekte nicht auflistet.