web-dev-qa-db-fra.com

Comment afficher uniquement les fichiers de la commande aws s3 ls?

J'utilise aws cli pour répertorier les fichiers dans un compartiment s3 à l'aide de la commande suivante ( documentation ):

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

Cette commande me donne la sortie suivante:

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

Cependant, voici ma sortie souhaitée:

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

Comment puis-je omettre la date, l'heure et la taille du fichier afin d'afficher uniquement la liste des fichiers?

27
Borealis

Vous ne pouvez pas faire cela uniquement avec la commande aws, mais vous pouvez facilement le diriger vers une autre commande pour supprimer la partie non souhaitée. Vous devez également supprimer l'indicateur --human-readable pour que la sortie soit plus facile à utiliser, et l'indicateur --summarize pour supprimer les données de résumé à la fin.

Essaye ça:

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

Edit: pour prendre en compte les espaces dans les noms de fichiers:

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

Un filtre simple serait:

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

Cela supprimera la date, l'heure et la taille. Ne laisse que le chemin complet du fichier. Cela fonctionne également sans le récursif et devrait également fonctionner avec le nom de fichier contenant des espaces.

7
Celogeek San

Pour seulement les fichier noms, je trouve le plus facile d’être:

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

Cela coupera la sortie renvoyée aux espaces (cut -d " ") et renverra la quatrième colonne (-f 4), qui correspond à la liste des noms de fichiers.

2

Simple Way

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

Utilisez s3api avec jq ( AWS docu aws s3api list-objects ):

Ce mode est toujours récursif.

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

Vous pouvez filtrer les sous-répertoires en ajoutant un préfixe (ici le répertoire foo). Le préfixe ne doit pas commencer par un /.

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

options jq:

  • -r = Mode brut, pas de guillemets en sortie
  • .Contents[] = Obtenir le contenu de la matrice d'objets Contents
  • .Key = Obtenir tous les champs de clé (ne produit pas de tableau JSON valide, mais nous sommes en mode brut, nous ne nous en soucions donc pas)
1
notes-jj

Une commande simple serait

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

Si vous avez besoin de l'horodatage, il suffit de mettre à jour les valeurs des champs de commande.

0
skipper21