2016-04-23 57 views
14

Sto usando il AWS cli per elencare i file in un secchio S3 utilizzando il seguente comando (documentation):Come visualizzare solo i file dal comando aws s3 ls?

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

Questo comando mi dà il seguente risultato:

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 

Tuttavia, questo è l'output desiderato:

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 

Come posso omettere la data, l'ora e la dimensione del file per visualizzare solo l'elenco dei file?

risposta

23

Non è possibile eseguire questa operazione con il solo comando aws, ma è possibile inserirlo facilmente in un altro comando per rimuovere la parte che non si desidera. È inoltre necessario rimuovere il flag --human-readable per ottenere l'output più facile con cui lavorare e il flag --summarize per rimuovere i dati di riepilogo alla fine.

Prova questa:

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

Edit: prendere gli spazi nei nomi dei file in considerazione:

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

Risposta parzialmente corretta: non funzionerà se c'è uno spazio nel nome del file. Anche 'awk '{print $ 5}'', non '$ 4' –

+3

@MichalGasek se rimuovi il flag' --human-readable' come specificato, quindi è $ 4, non $ 5. –

+0

Esatto, sono $ 4 allora. Dovrebbe ancora occuparsi degli spazi bianchi nei nomi dei file ... altrimenti emergono sorprese. –

5

Un semplice filtro potrebbe essere:

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

Questo eliminerà la data, tempo e dimensione. Ha lasciato solo il percorso completo del file. Funziona anche senza ricorsivo e dovrebbe funzionare anche con i nomi dei file che contengono spazi.

0

-semplice

aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29- 
+0

al momento, per me, uscite di' aws s3 ls' tali da voler tagliare su '-c32', non' -c29'; non sono sicuro se sono i miei dati o un cambiamento nel formato di output. (In realtà non ho sottocartelle.) Questo è vero per '--human-readable' o semplice output di default; le colonne sono lo stesso posto. Ma in realtà non c'è bisogno di leggibilità umana in questo caso.E in entrambi i casi si vorrebbe omettere il '--summarize'. In breve, 'aws s3 ls s3: // mybucket | cut -c32-'(e' --recursive' solo se desiderato) – michael

+0

Nota che tutte le altre risposte qui che tentano di tagliare in base agli spazi (awk, cut, qualunque) non funzioneranno se ci sono spazi nei nomi dei file . – michael

0

comando semplice sarebbe

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

Se è necessario il timestamp, basta aggiornare i valori dei campi di comando.