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


22

이것이 현재 날짜의 과거 날짜를 가져 오는지 또는 30 또는 31 일 밖에 걸리지 않는지 확실하지 않습니다.

예 :

현재 날짜가 March 28th1 개월 전인 경우 날짜가 February 28th언제 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 월 예일 때 어떻게 될지 알고 싶습니다. 그 파일들을 보관할까요? 또는 1 일째 파일을 제거 하시겠습니까?

31 일에 제거가 실행되므로 지난 달에 30 일만 있으면 첫 번째 파일이 제거됩니까?

나는 힌트를 바랍니다.


1
이 정확한 이유로 내가 3 월 30 일에 여기 있다는 것을 모르
십니까?

답변:


24

- 1 month월 번호에서 1을 빼고 결과 날짜가 유효하지 않은 경우 ( February 30예 :) 유효하도록 조정하십시오. 그래서 December 31 - 1 month입니다 December 1, 11 월에 일하지,하고 March 31 - 1 month있다 March 3(윤년에서 실행하지 않는 한).

Gnu ( 이 구문을 구현 하는 버전)에 대한 정보 페이지 의 인용문 에는 산술을보다 견고하게하기위한 좋은 제안이 포함되어 있습니다.datedate

단위의 퍼지가 관련 항목에 문제를 일으킬 수 있습니다. 예를 들어 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 월 상황에서 의심 스럽습니다 ... 3 월 29 일, 30 일 또는 31 일이면 현재 달이 존재하지 않으면 지난 달의 다음 수를 취할 수 있으므로이 세 가지 상황에서는 시간이 걸릴 수 있습니다 3 월 1 일 아니오? 3 월 29 일, 30 일, 31 일, 그리고 3 월 1 일, 2 일, 3 일, 3 월 1 일, 2 일, 3 일, 4 월 1 일이 3 월 4 일이되면 구조 조정으로 인해 3 월 4 일이 될 것입니다. ?
tachomi 2016 년

4 월 1 일 이전 1 월은 3 월 1 일이고 3 월 1 일 이전 1 개월은 2 월 1 일입니다. 이들은 문제가되지 않습니다. 문제는 4 월 31 일이 존재하지 않기 때문에 5 월 31 일 이전의 한 달이 5 월 1 일이라는 것입니다. 현재 날짜의 날짜가 아니라 1 개월 전 날짜의 날짜 번호를 확인해야합니다.
rici

2
도! 한 달에 특정 날짜의 "1 개월 전"이 같은 달 에 나타날 수 있다는 사실은 date구현 에서 기대할 수있는 것이 아닙니다 . 내 책에서는 의미 상 반 직관적입니다. -지적 해 주셔서 감사합니다. 알아두면 좋습니다.
Janis

2

백업 파일을 제거하기 위해 파일 이름을 사용하는 대신 시간 메타 데이터를 사용하는 것이 더 안전합니다.

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

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

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

첫 번째 또는 15 번째 파일을 유지하기 위해 다른 디렉토리에 저장하거나 -not -name 옵션으로 find 명령을 업데이트 할 수 있습니다.


0

다음과 같이 날짜가 어떻게 작동하는지 확인할 수 있습니다.

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 $ (날짜 + % m) $ (날짜 + % y) | egrep -v"$ (날짜 + % y) | Su "| xargs | awk '{print $ NF}')-"$ ( cal $ (날짜 -d "+1 개월 전"+ % m) $ (날짜 + % y) | egrep -v "$ (날짜 + % y) | Su"| xargs | awk '{print $ NF}') | 기원전

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

    echo "$ (cal $ (날짜 + % m) $ (날짜 + % y) | egrep -v"$ (날짜 + % y) | Su "| xargs | awk '{print $ NF}')-"$ ( cal $ (날짜 -d "+1 개월 전"+ % m) $ (날짜 + % y) | egrep -v "$ (날짜 + % y) | Su"| xargs | 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 /"에 변수를 추가 할 수도 있습니다.

결론 : 한 달보다 오래된 파일 (정확하게)을 삭제하려면 "date"명령과 "+1 개월 전"을 사용하는 경우 정확한 일 수를 조정해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.