
매시간 백업을 수행하여 오늘 날짜로 생성된 폴더에 저장하는 스크립트가 있습니다.
#CRONJOB TO BACKUP DB HOURLY
DAY=$(/bin/date +%d%m%Y)
TIME=$(/bin/date +%H%M%S)
if [ ! -d /home/user/Desktop/cron_database_hourly/$DAY ]; then
sudo mkdir /home/user/Desktop/cron_database_hourly/$DAY
fi
sudo chmod -R 755 //home/user/Desktop/cron_database_hourly/$DAY
cd /home/user/Desktop/cron_database_hourly/$DAY/
mysqldump -u root -p'password' current > current_$TIME.sql
zip current_$TIME.zip current_$TIME.sql > /dev/null 2>&1
sudo rm current_$TIME.sql
그러면 폴더 안에는 24개의 파일이 있게 됩니다.20072018그리고 이름은 다음과 같습니다current_000001.zip
이제 공간이 부족하여 하루에 하나의 백업만 유지하고 나머지는 모두 삭제하기로 결정했습니다.
23시간 백업을 제외한 모든 항목을 삭제하는 다음 스크립트를 시도했습니다.
sudo find /home/user/Desktop/cron_database_hourly/* -type f \( -name "*_00*.zip" -o -name "*_01*.zip" -o -name "*_02*.zip" -o -name "*_03*.zip" -o -name "*_04*.zip" -o -name "*_05*.zip" -o -name "*_06*.zip" -o -name "*_07*.zip" -o -name "*_08*.zip" -o -name "*_09*.zip" -o -name "*_10*.zip" -o -name "*_11*.zip" -o -name "*_12*.zip" -o -name "*_13*.zip" -o -name "*_14*.zip" -o -name "*_15*.zip" -o -name "*_16*.zip" -o -name "*_17*.zip" -o -name "*_18*.zip" -o -name "*_19*.zip" -o -name "*_20*.zip" -o -name "*_21*.zip" -o -name "*_22*.zip" \) -mtime +30 -delete
하지만 문제는 서버가 종료되어 23번째 백업을 사용할 수 없는 날이 있다는 것입니다. 위의 스크립트를 수정하여 다음을 확인하려면 어떻게 해야 합니까?각 날짜의 최신 백업 파일 해당 파일만 유지하고 나머지는 모두 삭제하시겠습니까?
답변1
당신이 사용할 수있는:
ls /home/user/Desktop/cron_database_hourly/$DAY/*_[012][0-9]*.zip | head -n -1 | \
while read -r f; do rm "$f"; done
이는 사전순으로 정렬된 디렉토리의 모든 아카이브 파일을 찾은 다음 를 사용하여 head
마지막( -n -1
)을 제외한 모든 파일을 나열하고 루프에서 나열된 파일을 제거합니다 while
.
라이브를 사용하기 전에 어떤 명령이 실행될지 확인하려면 처음 echo
에 먼저 입력하는 것이 좋습니다 .rm
답변2
같은 것
ls datedir | head -n -1 | xargs rm
(테스트되지 않았으므로 테스트 없이 귀중한 데이터를 여기에 적용하지 마십시오)