Как отсортировать вывод s3cmd ls по дате?

Как отсортировать вывод s3cmd ls по дате?

Я хочу отсортировать каталоги в хранилище S3 по дате, указанной в их имени.

Когда я бегу

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

он перечисляет такие каталоги, как

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/

Я хочу, чтобы они отображались в порядке даты, чтобы это выглядело примерно так

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

Я пробовал сортировать по столбцам и(на месяц) флаг, но он не работает.

Моя цель — удалить каталоги старшендней, но с тех порs3cmdls не возвращает дату создания/изменения каталогов, мне приходится идти сложным путем.

Как мне это реализовать?

решение1

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

Обратите внимание, что есть2пробелы в " Jan..."; это не ошибка: индексы в awk начинаются с 1, а не с 0, как в других языках.

решение2

Альтернатива GNU awkс использованиемdate

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

Прохождение

Разделите $0ваши поля на /или_

awk -F'[/_]' '{

Перепишите их как действительную дату

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

Используйте функцию оболочки date, чтобы преобразовать месяц из текста в число и получить его обратно, передав через awk' getlineв новую переменную.

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

Ничего нового.

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

Выход

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/

Альтернативанемного тоньше, используяgensub

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

Связанный контент