wake-up-neo.net

So löschen Sie mehrere Dateien im S3-Bucket mit AWS CLI

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.

10
Saqib Ali

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"}]}'
9
spg

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.

Quelle: Verwendung von Ausschluss- und Einschlussfiltern

22
Khalid T.

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" ```
3
Sunny Sharma

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
1
coder

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.

0
ddrypczewski

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 
0
Yogesh Patil

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.

0
Thyag