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

列で並べ替えてみましたが、-M(月)フラグですが、機能しません。

私の目標は、以下の期間より古いディレクトリを削除することです。日ですが、それ以来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 のインデックスは他の言語のように 0 からではなく 1 から始まります。

答え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取り戻します。awkgetline

    "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

関連情報