Wie sortiert man die s3cmd ls-Ausgabe nach Datum?

Wie sortiert man die s3cmd ls-Ausgabe nach Datum?

Ich möchte Verzeichnisse in einem S3-Speicher nach dem im Namen eingebetteten Datum sortieren.

Wenn ich laufe

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

Es listet die Verzeichnisse wie

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/

Ich möchte, dass diese in chronologischer Reihenfolge angezeigt werden, sodass es ungefähr so ​​aussieht

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

Ich habe versucht, mit Spalte zu sortieren und-M(für Monat)-Flagge, aber es funktioniert nicht.

Mein Ziel ist das Löschen von Verzeichnissen, die älter sind alsNTagen, aber seits3cmdls gibt das Erstellungs-/Änderungsdatum von Verzeichnissen nicht zurück, ich muss es auf die harte Tour machen.

Wie kann ich das zum Laufen bringen?

Antwort1

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

Beachten Sie, dass es2Leerzeichen in " Jan..."; das ist kein Fehler: Indizes in awk beginnen bei 1, nicht bei 0 wie in anderen Sprachen.

Antwort2

Eine GNU- awkAlternative mit Verwendung vondate

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

Lösungsweg

Teilen Sie $0Ihre Felder auf /oder_

awk -F'[/_]' '{

Als gültiges Datum neu zusammenstellen

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

Verwenden Sie die Shell- Funktion, um den Monat von Text in eine Zahl umzuwandeln und ihn durch Weiterleiten in eine neue Variable datezurückzuholen.awkgetline

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

Hier gibt es nichts Neues

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

Ausgabe

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/

Alternativeetwas schlanker durchgensub

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

verwandte Informationen