¿Cómo ordenar la salida de s3cmd ls por fecha?

¿Cómo ordenar la salida de s3cmd ls por fecha?

Quiero ordenar directorios en un almacenamiento s3 por la fecha incluida en su nombre.

cuando corro

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

enumera los directorios 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/

Quiero que se muestren en orden de fecha para que se vea así

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/
....
....

Intenté ordenar con columna y-METRO(por mes), pero no funciona.

Mi objetivo es eliminar directorios anteriores anortedías, pero desdes3cmdls no devuelve la fecha de creación/modificación de los directorios, tengo que hacerlo de la manera más difícil.

¿Cómo puedo hacer que esto funcione?

Respuesta1

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

Note que hay2espacios en " Jan..."; eso no es un error: los índices en awk comienzan desde 1, no desde 0 como en otros idiomas.

Respuesta2

Una awkalternativa a GNU con 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

Tutorial

Divida $0sus campos en /o_

awk -F'[/_]' '{

Recomponerlos como fecha válida

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

Utilice la función Shell datepara convertir el mes de texto a un número y recuperarlo canalizando awk's getlinea una nueva variable

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

Nada nuevo aquí

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

Producción

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/

Alternativaligeramente más delgado usandogensub

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

información relacionada