date 명령의 "1개월 전" 옵션은 어떻게 작동합니까?

date 명령의 "1개월 전" 옵션은 어떻게 작동합니까?

현재 날짜 내에서 과거 날짜를 얻을 수 있는지, 아니면 30일 또는 31일만 필요한지 확실하지 않습니다.

예를 들어

현재 날짜가 March 28th1개월 전 이라면 February 28th1개월 전에는 무슨 일이 일어났나요 March 30th?

상상하다

$(date +%Y%m%d)매일 일부 파일을 백업하고 싶습니다. 스크립트는 이러한 파일을 현재 날짜 내의 형식으로 저장합니다. 예를 들어 20150603_bckp.tar.gz다음 달이 오면 1일과 15일의 파일을 제외하고 1개월 전의 모든 파일을 삭제합니다. , 그래서 여기에 내가 사례가 있습니다:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi

그런데 날짜가 30일, 31일 또는 심지어 지난 2월인 경우 어떻게 되는지 궁금합니다. 해당 파일이 보존되나요? 아니면 첫날부터 파일을 삭제하시겠습니까?

31일이 되면 Purge를 하게 되는데 지난 달이 30일밖에 안 남았다면 1일째부터 파일이 삭제되는 건가요?

내가 그걸 암시했으면 좋았을 텐데.

답변1

- 1 month월 번호에서 하나를 뺀 후 결과 날짜가 유효하지 않은 경우( February 30예를 들어) 유효하도록 조정됩니다. 또한 11월의 날이 December 31 - 1 month아니며 , (윤년에 실행되지 않는 한) 그렇습니다 .December 1March 31 - 1 monthMarch 3

여기에 인용된 내용은정보 페이지Gnu date( date이 구문을 구현하는 버전)의 경우 산술을 더욱 강력하게 만들기 위한 좋은 제안이 포함되어 있습니다.

단위가 모호하면 관련 프로젝트에 문제가 발생할 수 있습니다. 예를 들어 2003-07-31 -1 month2003-06-31은 유효하지 않은 날짜이므로 2003-07-01로 계산될 수 있습니다. 이전 달을 보다 확실하게 확인하려면 이번 달 15일 이전의 달을 요청할 수 있습니다. 예를 들어:

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!

정보 페이지에서도 인용된 또 다른 경고:

또한 시계 변경(예: 일광 절약 시간제 점프)에 맞춰 날짜를 조작할 때는 주의하세요. 어떤 경우에는 시계에 24시간을 더하거나 빼기 때문에 TZ달력 계산을 시작하기 전에 환경 변수를 로 설정하여 표준시를 채택하는 것이 현명한 경우가 많습니다.UTC0

답변2

백업 파일을 제거하기 위해 파일 이름에 의존하는 것보다 임시 메타데이터에 의존하는 것이 더 안전합니다.

예를 들어 다음 명령을 사용하면 30일이 지난 모든 파일을 삭제할 수 있습니다.

/usr/bin/find /path/to/your/files -type f -ctime +30 -delete

무료 보너스로 이 프로그램을 매일 실행하면 한 달 동안 백업 파일을 저장할 수 있어 디스크 공간 관리가 더 잘됩니다.

1번째 또는 15번째 파일을 보존하려면 해당 파일을 다른 디렉토리에 저장하거나 -not -name 옵션을 사용하여 find 명령을 업데이트할 수 있습니다.

답변3

다음을 통해 날짜가 어떻게 작동하는지 확인할 수 있습니다.

date -d "$(date -d "Mar 31 2019" +%F) +1 month ago"
Sun Mar  3 00:00:00 EET 2019

그래서 지난 달 이번 달(3월이면 현재가 아님)을 기준으로 이번 달에서 지난 달의 일수를 줄여볼까 생각했습니다.

다음 구문을 사용하여 며칠(아래 예에서는 31일)보다 오래된 파일을 삭제할 수 있습니다. 한 줄로 문제를 해결하세요(간단한 방법입니다).

find /path/to/folder/with/arhives/ -mindepth 1 -mtime +31 -delete

보다 자세한 접근 방식을 위해 다음을 수행할 수도 있습니다. 1. 이번 달의 일 수를 찾습니다.

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. 지난 달의 일수를 구합니다.

    echo "$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')-"$( cal $(date -d "+1개월 전" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | awk '{print $NF}') |

  2. 이제 우리는 이 두 달의 차이점을 발견했습니다.

    echo "$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')-"$( cal $(date -d "+1개월 전" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | awk '{print $NF}') |

이제 이 3단계에 몇 가지 변수를 할당해 보겠습니다. 1단계 변수명: FCM 2단계 변수명: FLM 3단계 변수명: DCL

FCM=$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
FLM=$(al $(date -d "+1 month ago" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
DCL=$(echo "$FCM-$FLM" | bc)

$DCL이 0(영)인지 확인하고 $FCM과 $FLM의 차이에 따라 삭제합니다.

if [ $DCL -ne 0 ]; then
    if [ $DCL -lt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    elif [ $DCL -gt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    fi
else
    find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$FLM -delete
fi

"/path/to/folde/with/arhives/"에 변수를 추가할 수도 있습니다.

결론: (정확히) 한 달이 지난 파일을 삭제하려면 "+1개월 전"과 함께 "date" 명령을 사용하면 정확한 일수를 조정해야 합니다.

관련 정보