各フォルダの最新のファイルのみを保持し、他のすべてを削除する ubuntu スクリプト

各フォルダの最新のファイルのみを保持し、他のすべてを削除する ubuntu スクリプト

1 時間ごとにバックアップを取得し、今日の日付で作成されたフォルダー内に保存するスクリプトがあります。

#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名前は次のようになります現在の_000001.zip

現在、スペースが不足しているため、1 日あたり 1 つのバックアップのみを保持し、その他はすべて削除することにしました。

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に beforeを配置することをお勧めします。rm

答え2

何かのようなもの

ls datedir | head -n -1 | xargs rm

(テストされていないため、貴重なデータをテストなしでこれにさらさないでください)

関連情報