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 awk
alternativa 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 $0
sus campos en /
o_
awk -F'[/_]' '{
Recomponerlos como fecha válida
D=$(NF-3)"-"$(NF-2)"-"$(NF-1);
Utilice la función Shell date
para convertir el mes de texto a un número y recuperarlo canalizando awk
's getline
a 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