파일 목록(날짜 포함)을 날짜 목록으로 변환

파일 목록(날짜 포함)을 날짜 목록으로 변환

백업이 저장되는 디렉토리가 있습니다. Complete Backup YYYY-MM-DD hh-mm-ss.tar.bz2내가 찾은 형식은 date명령에 날짜를 입력하는 데 사용할 수 있습니다 date --date="YY-MM-DD hh:mm:ss".

그렇다면 공백으로 구분된 날짜 목록을 어떻게 얻을 수 있습니까? 날짜는 date형식을 지정하기 위해 호출을 통해 실행되어야 합니다 .

나는 (한 줄에 하나의 항목) 형식으로 목록을 제공하는 이 명령을 생각해 냈습니다 YYYY-MM-DD hh-mm-ss. 그렇다면 어떻게 형식을 올바르게 지정하고 각각에 날짜를 추가하고 공백으로 구분합니까?

dir backups/ | grep '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\\ [0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.tar\.bz2$' | sed 's/\\//g' | sed 's/\.tar\.bz2//g' | sed 's/Complete Backup //g'

참고: 출력은 선택 루프에서 사용되므로 날짜에 속한 모든 공간을 이스케이프해야 합니다.

답변1

다음은 날짜 형식을 다시 지정합니다.

dir -1 backups | awk '/Complete\\ Backup\\ .*\.tar\.bz2/ { gsub(/\\/, ""); sub(/Complete Backup /, ""); sub(/.tar.bz2/, ""); gsub(/-/, " "); print strftime("%c", mktime($0)); }'

이를 선택 항목에 통합하는 방법은 다음과 같습니다.

OIFS="$IFS"; IFS=$'\n'; set -- $(dir -1 backups | awk '/Complete\\ Backup\\ .*\.tar\.bz2/ { gsub(/\\/, ""); sub(/Complete Backup /, ""); sub(/.tar.bz2/, ""); gsub(/-/, " "); print strftime("%c", mktime($0)); }'); IFS="$OIFS"
select date in "$@"; do echo "$date"; done

날짜를 정렬하는 버전은 다음과 같습니다.

OIFS="$IFS"
IFS=$'\n'

set -- $(
    dir -1 backups |
    awk '/Complete\\ Backup\\ .*\.tar\.bz2/ \
         {
            gsub(/\\/, "");
            sub(/Complete Backup /, "");
            sub(/.tar.bz2/, "");
            gsub(/-/, " ");
            VAL[NR] = mktime($0);
         }

         END \
         {
            for ( i = asort(VAL); i > 0; i-- )
            {
                    print strftime("%a %b %d %T %Z %Y", VAL[i]);
            }
         }'
    )

IFS="$OIFS"

select date in "$@"
do
    echo "$date"
done

답변2

여기 있어요:

dates=($(for i in backups/*.tar.bz2;do #Glob eliminates need to list all files
             date=${i/Complete Backup /} #Remove "Complete Backup "
             date=${date%%.*} #Remove ".tar.bz2"
             date=${date/ /,} #Substitue , for space
             echo $date #Echo the date for sed
         done|sed -e 's/\([0-9]\+\)-\([0-9]\+\)-\([0-9]\+\)$/\1:\2:\3/'|sort -r|xargs echo))
select date in ${dates[@]};do
    echo "$date"
done

한 가지 더: 이것을 루프에 사용하는 경우 select공백으로 구분된 날짜를 어떻게 구별할 수 있나요? 날짜와 시간을 구분하기 위해 공백을 사용한다는 뜻이므로 혼란스러울 수 있습니다.

편집하다

  • 귀하의 의견이 그런 방식으로 정렬해야 한다고 제안했기 때문에 최신 항목부터 오래된 항목까지 날짜 정렬을 추가했습니다.
  • select날짜 및 시간 쌍이 새 항목과 구별될 수 있도록 날짜 및 시간을 쉼표로 구분하는 코드가 추가되었습니다 .
  • 전체 데이터를 select루프 로 래핑하여 날짜를 배열에 저장한 다음 루프를 반복하여 select루프가 다시 실행될 때마다 날짜를 다시 구문 분석할 필요가 없도록 합니다.

관련 정보