이제 cronjob을 사용하여 매일 mysql 데이터베이스를 백업합니다. 이제 서버가 가득 차서 한 달에 하나의 백업, 매주 일요일에 하나의 백업, 마지막 7개의 백업만 보관하고 싶습니다.
내 백업 파일은 다음과 같습니다(디렉터리에서 /var/backup
).
full_2015-05-16-061115.sql.gz.enc
full_2015-05-17-061117.sql.gz.enc
...
이 서버 오류 게시물은 다음과 같습니다.https://serverfault.com/a/643335/274380 쉘 스크립트를 작성하고 올바른 날짜를 결정하여 배열에 넣는 방법을 도와주세요.
위 게시물의 스크립트를 다음과 같이 일부 수정했습니다.
for i in {0..7};
do
index=$(date +"%Y%m%d" -d "-$i day");
value=$(date +"%Y-%m-%d" -d "-$i day");
keep[index]=$value;
done;
for i in {0..4};
do
index=$(date +"%Y%m%d" -d "sunday-$((i+1)) week");
value=$(date +"%Y-%m-%d" -d "sunday-$((i+1)) week");
keep[index]=$value;
done
for i in {0..12};
do
DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
((DW+=$(date -d $AY-12-31 +%W)))
done
index=$(date +"%Y%m%d" -d "sunday-$DW weeks");
value=$(date +"%Y-%m-%d" -d "sunday-$DW weeks");
keep[index]=$value;
done
echo ${keep[@]};
출력은 다음과 같습니다
2014-05-04 2014-06-01 2014-07-06 2014-08-03 2014-09-07 2014-10-05 2014-11-02 2014-12-07 2015-01-04 2015-02-01 2015-03-01 2015-04-05 2015-04-26 2015-05-03 2015-05-10 2015-05-17 2015-05-20 2015-05-21 2015-05-22 2015-05-23 2015-05-24 2015-05-25 2015-05-26 2015-05-27
${keep[@]}
그래서 제 질문은 날짜가 있는 곳에 파일을 보관 ${keep[@]}
하고 나머지는 삭제하는 방법 에 관한 것입니다 .
미리 감사드립니다!
답변1
이것이 내가 하는 방법이다:
find /var/backup/ -type f -maxdetph 1 $(printf "! -name %s " ${keep[*]}) \
-exec rm {} \;
파일 이름에 공백이 포함되어 있으면 작동하지 않습니다.
답변2
grep -vE
다음 표현과 함께 사용하면 어떨까요?
$ echo "$(IFS=\| && echo "${keep[*]}")"
2014-05-04|2014-06-01|2014-07-06|2014-08-03|2014-09-07|2014-10-05|2014-11-02|2014-12-07|2015-01-04|2015-02-01|2015-03-01|2015-04-05|2015-04-26|2015-05-03|2015-05-10|2015-05-17|2015-05-20|2015-05-21|2015-05-22|2015-05-23|2015-05-24|2015-05-25|2015-05-26|2015-05-27
그래서 당신은 이것을 할 수 있습니다 :
ls /var/backup/* | grep -vE "$(IFS=\| && echo "${keep[*]}")" | xargs -r rm
고쳐 쓰다:찾기를 사용하려는 경우:
find /var/backup -maxdepth 1 -type f | grep -vE "$(IFS=\| && echo "${keep[*]}")" | xargs -r rm
또는 더 복잡한 것:
find /var/backup -maxdepth 1 -type f -regextype posix-egrep ! -regex ".*($(IFS=\| && echo "${keep[*]}")).*" -print0 | xargs -0r rm