각 폴더의 최신 파일만 유지하고 나머지는 모두 삭제하는 우분투 스크립트

각 폴더의 최신 파일만 유지하고 나머지는 모두 삭제하는 우분투 스크립트

매시간 백업을 수행하여 오늘 날짜로 생성된 폴더에 저장하는 스크립트가 있습니다.

#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

(테스트되지 않았으므로 테스트 없이 귀중한 데이터를 여기에 적용하지 마십시오)

관련 정보