如何按日期對 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(月份)標誌,但它不起作用。

我的目標是刪除早於n天,但自從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...";這不是一個 bug:awk 中的索引從 1 開始,而不是像其他語言那樣從 0 開始。

答案2

一個 GNUawk替代方案,使用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);

使用 shelldate函數將月份從文字轉換為數字,並透過將awk's傳遞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

相關內容