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

나는 열로 정렬을 시도했고-중(월별) 플래그가 있지만 작동하지 않습니다.

내 목표는 다음보다 오래된 디렉토리를 삭제하는 것입니다.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..."; 의 공백 그건 버그가 아닙니다. awk의 인덱스는 다른 언어처럼 0부터 시작하는 것이 아니라 1부터 시작합니다.

답변2

awk다음을 사용하는 GNU 대안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'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

관련 정보