it-swarm.com.de

Wie zeige ich nur Dateien vom Befehl aws s3 ls an?

Ich verwende aws cli, um die Dateien in einem s3-Bucket mit dem folgenden Befehl ( documentation ) aufzulisten:

aws s3 ls s3://mybucket --recursive --human-readable --summarize

Dieser Befehl gibt mir folgende Ausgabe:

2013-09-02 21:37:53   10 Bytes a.txt
2013-09-02 21:37:53  2.9 MiB foo.Zip
2013-09-02 21:32:57   23 Bytes foo/bar/.baz/a
2013-09-02 21:32:58   41 Bytes foo/bar/.baz/b
2013-09-02 21:32:57  281 Bytes foo/bar/.baz/c
2013-09-02 21:32:57   73 Bytes foo/bar/.baz/d
2013-09-02 21:32:57  452 Bytes foo/bar/.baz/e
2013-09-02 21:32:57  896 Bytes foo/bar/.baz/hooks/bar
2013-09-02 21:32:57  189 Bytes foo/bar/.baz/hooks/foo
2013-09-02 21:32:57  398 Bytes z.txt

Total Objects: 10
   Total Size: 2.9 MiB

Dies ist jedoch meine gewünschte Ausgabe:

a.txt
foo.Zip
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
foo/bar/.baz/d
foo/bar/.baz/e
foo/bar/.baz/hooks/bar
foo/bar/.baz/hooks/foo
z.txt

Wie kann ich Datum, Uhrzeit und Dateigröße auslassen, um nur die Dateiliste anzuzeigen?

27
Borealis

Sie können dies nicht nur mit dem Befehl aws tun, sondern Sie können ihn leicht an einen anderen Befehl weiterleiten, um den nicht benötigten Teil zu entfernen. Sie müssen auch das Flag --human-readable entfernen, um die Ausgabe einfacher zu gestalten, und das Flag --summarize, um die Zusammenfassungsdaten am Ende zu entfernen.

Versuche dies:

aws s3 ls s3://mybucket --recursive | awk '{print $4}'

Bearbeiten: um Leerzeichen in Dateinamen zu berücksichtigen:

aws s3 ls s3://mybucket --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//'
42
Mark B

Ein einfacher Filter wäre:

aws s3 ls s3://mybucket --recursive | Perl -pe 's/^(?:\S+\s+){3}//'

Dadurch werden Datum, Uhrzeit und Größe entfernt. Hat nur den vollständigen Pfad der Datei hinterlassen. Es funktioniert auch ohne das rekursive und sollte auch mit Dateinamen, die Leerzeichen enthalten, funktionieren.

7
Celogeek San

Für nur die Datei Namen finde ich am einfachsten:

aws s3 ls s3://path/to/bucket/ | cut -d " " -f 4

Dadurch wird die zurückgegebene Ausgabe an den Leerzeichen (cut -d " ") geschnitten und die vierte Spalte (-f 4), die Liste der Dateinamen, zurückgegeben.

2

Einfacher Weg

aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
2
Tech Support

Meine Lösung

Listet nur Dateien rekursiv mit aws cli auf.

aws s3 ls s3://myBucket --recursive | awk 'NF>1{print $4}' | grep .

grep . - Leere Zeilen löschen.


Beispiel: aws s3 ls s3://myBucket

                           PRE f5c10c1678e8484482964b8fdcfe43ad/
                           PRE f65b94ad31734135a61a7fb932f7054d/
                           PRE f79b12a226b542dbb373c502bf125ffb/
                           PRE logos/
                           PRE test/
                           PRE userpics/
2019-05-14 10:56:28       7754 stage.js

Lösung: aws s3 ls s3://myBucket --recursive | awk 'NF>1{print $4}' | grep .

stage.js
1
nsantana

Verwenden Sie das s3api mit jq ( AWS docs aws s3api list-objects ):

Dieser Modus ist immer rekursiv.

$ aws s3api list-objects --bucket "bucket" | jq -r '.Contents[].Key'
a.txt
foo.Zip
foo/bar/.baz/a
[...]

Sie können Unterverzeichnisse filtern, indem Sie ein Präfix hinzufügen (hier foo Verzeichnis). Das Präfix darf nicht mit einem / beginnen.

$ aws s3api list-objects --bucket "bucket" --prefix "foo/" | jq -r '.Contents[].Key'
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
[...]

jq Optionen:

  • -r = Raw-Modus, keine Ausgabe in Anführungszeichen
  • .Contents[] = Contents Objekt-Array-Inhalt abrufen
  • .Key = Hole jedes Schlüsselfeld (erzeugt kein gültiges JSON-Array, aber wir befinden uns im Rohmodus, also ist es uns egal)
1
notes-jj

Ein einfacher Befehl wäre

aws s3 ls s3://mybucket --recursive --human-readable --summarize |cut -d ' ' -f 8

Wenn Sie den Zeitstempel benötigen, aktualisieren Sie einfach die Werte der Befehlsfelder.

0
skipper21