현재 날짜 내에서 과거 날짜를 얻을 수 있는지, 아니면 30일 또는 31일만 필요한지 확실하지 않습니다.
예를 들어
현재 날짜가 March 28th
1개월 전 이라면 February 28th
1개월 전에는 무슨 일이 일어났나요 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 1
March 31 - 1 month
March 3
여기에 인용된 내용은정보 페이지Gnu date
( date
이 구문을 구현하는 버전)의 경우 산술을 더욱 강력하게 만들기 위한 좋은 제안이 포함되어 있습니다.
단위가 모호하면 관련 프로젝트에 문제가 발생할 수 있습니다. 예를 들어
2003-07-31 -1 month
2003-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}'
지난 달의 일수를 구합니다.
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}') |
이제 우리는 이 두 달의 차이점을 발견했습니다.
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" 명령을 사용하면 정확한 일수를 조정해야 합니다.