ubuntu腳本僅保留每個資料夾的最新檔案並刪除其他所有內容

ubuntu腳本僅保留每個資料夾的最新檔案並刪除其他所有內容

我們有一個腳本,每小時進行備份並將其儲存在創建為今天日期的資料夾中。

#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,以便在使用 live 之前查看會執行哪些命令。

答案2

就像是

ls datedir | head -n -1 | xargs rm

(未經測試,因此請勿在未經測試的情況下使用寶貴的數據)

相關內容