내 디렉토리 구조는 다음과 같습니다.
backup-2018-01-12
backup-2018-01-13
backup-2018-01-14
backup-2018-01-15
backup-2018-01-16
backup-2018-01-17
backup-2018-01-18
backup-2018-01-19
backup-2018-01-20
backup-2018-01-21
backup-2018-01-22
backup-2018-01-23
backup-2018-01-24
backup-2018-01-25
backup-2018-01-26
backup-2018-01-27
backup-2018-01-28
backup-2018-01-29
backup-2018-01-30
backup-2018-01-31
backup-2018-02-01
backup-2018-02-02
backup-2018-02-03
backup-2018-02-04
backup-2018-02-05
backup-2018-02-06
backup-2018-02-07
backup-2018-02-08
backup-2018-02-09
backup-2018-02-10
backup-2018-02-11
backup-2018-02-12
backup-2018-02-13
backup-2018-02-14
backup-2018-02-15
스크립트를 이용하여 최근 7일, 주간 마지막 백업을 최대 4주간 저장하는 방법
예를 들어
그래서 난 계속
backup-2018-01-25 <-- this is 3 waeks from now and so on.
backup-2018-02-02 <-- this is 2 weeks earlier from now
backup-2018-02-09
backup-2018-02-10
backup-2018-02-11
backup-2018-02-12
backup-2018-02-13
backup-2018-02-14
backup-2018-02-15
그래서 나는 노력했다
find -type d -name 'backup-*' -mtime +7 -exec rm -v {} \;
이렇게 하면 최근 7일이 유지되지만 7일보다 오래된 모든 항목이 삭제됩니다.
답변1
간단한 해결책을 찾지 못했습니다. 이 문제를 해결하기 위해 제가 찾은 가장 쉬운 방법은 "제거" 목록 대신 "유지" 목록을 사용하는 것입니다. 그런 다음 마지막 N개의 백업과 M주 동안의 주간 범위에 대한 최신 백업을 목록에 추가할 수 있습니다. (얼마 전에 작성한 내 코드에서는 월, 분기, 연도로 확장했습니다.) 분명히 일부 겹치는 부분이 있지만 "유지" 목록이므로 별 문제가 되지 않습니다. 그런 다음 목록에 없는 모든 항목을 제거합니다. 먼저 목록이 비어 있지 않은지 확인하세요.
#!/bin/bash
#
dirs=(
backup-2018-01-12
backup-2018-01-13
backup-2018-01-14
backup-2018-01-15
backup-2018-01-16
backup-2018-01-17
backup-2018-01-18
backup-2018-01-19
backup-2018-01-20
backup-2018-01-21
backup-2018-01-22
backup-2018-01-23
backup-2018-01-24
backup-2018-01-25
backup-2018-01-26
backup-2018-01-27
backup-2018-01-28
backup-2018-01-29
backup-2018-01-30
backup-2018-01-31
backup-2018-02-01
backup-2018-02-02
backup-2018-02-03
backup-2018-02-04
backup-2018-02-05
backup-2018-02-06
backup-2018-02-07
backup-2018-02-08
backup-2018-02-09
backup-2018-02-10
backup-2018-02-11
backup-2018-02-12
backup-2018-02-13
backup-2018-02-14
backup-2018-02-15
)
declare -A list
declare -A keep
####################################################################################
# Go
#
prefix="backup-"
today=$(date +%Y-%m-%d)
# Populate list from set of directories
#
for item in "${dirs[@]}"
do
list[$item]="$item"
done
# Build keep list from business criteria
#
for dayback in {0..6}
do
dateback=$(date --date "$today - $dayback day" +%Y-%m-%d)
keep[$prefix$dateback]=1
done
for weekback in {0..3}
do
dateback1=$(date --date "$today - $weekback week" +%Y-%m-%d)
dateback2=$(date --date "$today - $((weekback + 1)) week" +%Y-%m-%d)
# Look for newest in range
#
newest=
dateback="$dateback1"
while [[ $dateback != $dateback2 ]]
do
[[ -n ${list[$prefix$dateback]} ]] && newest=$dateback && break
dateback=$(date --date "$dateback - 1 day" +%Y-%m-%d)
done
[[ -n $newest ]] && keep[$prefix$newest]=1
done
# We now have a keep list, so delete anything not in that list
#
for item in "${list[@]}"
do
[[ -n ${keep[$item]} ]] && echo "KEEP $item" || echo "DELETE $item"
done
# All done
#
exit 0
만족스러우면 마지막에 echo 문을 변경하거나 확장하여 실제 삭제를 수행하세요.
답변2
무슨 일이야?
for i in $(find . -maxdepth 1); do
if ! (( $((($(date +%s) - $(date +%s -r $i )) / 86400)) % 7)); then
echo $i # Print out the folder. Can be replaced with your action
fi
done
또는 한 줄로:
for i in $(find . -maxdepth 1); do if ! (( $((($(date +%s) - $(date +%s -r $i )) / 86400)) % 7)); then echo "$i $i_weekly" ;fi; done
7, 14, 21, 28...일 전의 모든 폴더만 인쇄됩니다. "Echo" 대신에 MV 같은 걸 만들어 보세요...
답변3
backup-*-*-01
다음은 백업을 순환하면서 지난 7일, 12개월, 10년을 유지하는 샘플 스크립트입니다.backup-*-01-01
all=$(ls backup-*)
days=$(ls backup-* | tail -n 7)
monthes=$(ls backup-*-01 | tail -n 12)
years=$(ls backup-*-01-01 | tail -n 10)
keep=" $days $monthes $years "
for item in $all
do
if ! [[ "$keep" =~ "$item" ]]
then
echo "$item will be deleted"
# rm $item
fi
done