Como classificar a saída s3cmd ls por data?

Como classificar a saída s3cmd ls por data?

Quero classificar os diretórios em um armazenamento s3 pela data incorporada em seus nomes.

Quando eu corro

s3cmd ls s3://xyz/private/backups/mails/daily/ | awk '{print $2}'

ele lista os diretórios como

s3://xyz/private/backups/mails/daily/01_Apr_2020/
s3://xyz/private/backups/mails/daily/02_Apr_2020/
s3://xyz/private/backups/mails/daily/03_Apr_2020/
s3://xyz/private/backups/mails/daily/04_Apr_2020/
s3://xyz/private/backups/mails/daily/05_Apr_2020/
s3://xyz/private/backups/mails/daily/06_Apr_2020/
s3://xyz/private/backups/mails/daily/07_Apr_2020/
s3://xyz/private/backups/mails/daily/08_Apr_2020/
s3://xyz/private/backups/mails/daily/09_Apr_2020/
s3://xyz/private/backups/mails/daily/10_Apr_2020/
s3://xyz/private/backups/mails/daily/11_Apr_2020/
s3://xyz/private/backups/mails/daily/12_Apr_2020/
s3://xyz/private/backups/mails/daily/13_Apr_2020/
s3://xyz/private/backups/mails/daily/14_Apr_2020/
s3://xyz/private/backups/mails/daily/15_Apr_2020/
s3://xyz/private/backups/mails/daily/30_Mar_2020/
s3://xyz/private/backups/mails/daily/31_Mar_2020/

Quero que eles sejam exibidos em ordem de data para que fique parecido com isto

s3://xyz/private/backups/mails/daily/30_Mar_2020/
s3://xyz/private/backups/mails/daily/31_Mar_2020/
s3://xyz/private/backups/mails/daily/01_Apr_2020/
s3://xyz/private/backups/mails/daily/02_Apr_2020/
s3://xyz/private/backups/mails/daily/03_Apr_2020/
....
....

Eu tentei classificar com coluna e-M(por mês) sinalizador, mas não está funcionando.

Meu objetivo é excluir diretórios anteriores andias, mas desdes3cmdls não retorna a data de criação/modificação dos diretórios, tenho que fazer isso da maneira mais difícil.

Como posso fazer isso funcionar?

Responder1

... |
awk -F'[/_]' '{printf "%04d%02d%02d %s\n", $(NF-1), index("  JanFebMarAprMayJunJulAugSepOctNovDec",$(NF-2))/3, $(NF-3), $0}' |
sort |
sed 's/[0-9]* //'

Observe que existem2espaços em " Jan..."; isso não é um bug: os índices no awk começam em 1, não em 0 como em outras linguagens.

Responder2

Uma alternativa GNU awkcom uso dedate

awk -F'[/_]' '{
    D=$(NF-3)"-"$(NF-2)"-"$(NF-1);
    "date +%Y-%m-%d -d "D|getline nd;
    print nd, $0
}' file1 | sort | cut -d" " -f 2

Passo a passo

Divida $0seus campos em /ou_

awk -F'[/_]' '{

Recomponha-os como uma data válida

    D=$(NF-3)"-"$(NF-2)"-"$(NF-1);

Use a função shell datepara converter o mês de texto em um número e recuperá-lo canalizando awk's getlinepara uma nova variável

    "date +%Y-%m-%d -d "D|getline nd;

Nada de novo aqui

    print nd, $0
}' file1 | sort | cut -d" " -f 2

Saída

s3://xyz/private/backups/mails/daily/30_Mar_2020/
s3://xyz/private/backups/mails/daily/31_Mar_2020/
s3://xyz/private/backups/mails/daily/01_Apr_2020/
s3://xyz/private/backups/mails/daily/02_Apr_2020/
s3://xyz/private/backups/mails/daily/03_Apr_2020/

Alternativaum pouco mais magro usandogensub

awk -F'/' '{
    "date +%Y%m%d -d "gensub("_","-","g",$(NF-1))|getline nd;
    print nd, $0
}' file1 | sort | cut -d" " -f2

informação relacionada