
30日後にMySQLダンプファイルを削除する必要がある新しい要件があります。これらのファイルは "all-mysql-YYYYMMDD-HHMM.dump"という命名規則を使用します。ファイルはSANマウントファイルシステムにあるため、回復は問題になりません。しかし、残念ながら、ドライブスペースは限られており、すぐに埋められ、頻繁に手動介入が必要です。
ファイル名の例
- すべて-mysql-20130324-2330.dump
- すべて-mysql-20130325-2330.dump
- すべて-mysql-20130326-2330.dump
私の最初の考えは、-mtime +30を使用してバッチスクリプトで「検索」を使用することでしたが、修正時間は保証されていません。
次のBASHスクリプトを作成しましたが、これを行うためのよりきれいな方法があることを望みました。
#!/bin/bash
STARTING_DIR=$(pwd)
FILE_PREFIX=all-mysql-
BACKUP_DIR=/opt/backup/mysql/dumps
ARCHIVE_WINDOW_DAYS=30
cd $BACKUP_DIR
# Create YYYYMMDD datestamp for Today - $ARCHIVE_WINDOW_DAYS
ARCHIVE_WINDOW_IN_SECS=$(echo "$(date +%s) - (${ARCHIVE_WINDOW_DAYS} * 86400)" | bc)
PURGE_BEFORE_DATE=$(date -d @${ARCHIVE_WINDOW_IN_SECS} +%Y%m%d)
for backup_file in $FILE_PREFIX*
do
# Trim prefix, time portion of date stamp, and file extension
# from $backup_file to allow numeric comparison against YYYYMMDD
backup_trim_tmp=${backup_file#${FILE_PREFIX}}
backup_trimmed=${backup_trim_tmp%-****.dump}
if [ ${PURGE_BEFORE_DATE} -gt ${backup_trimmed} ]
then
rm $backup_file
fi
done
cd $STARTING_DIR
答え1
最後の30個のファイルを除くすべてのファイルを削除する別の方法:
rm $(ls -r | tail -n +31)
または、元の投稿の短いバージョンのスクリプトは次のようになります。
cd /opt/backup/mysql/dumps
d=$(date -r $(($(date +%s)-30*86400)) +%Y%m%d)
for f in all-mysql-*; do
[[ ${f#all-mysql-} < $d ]] && rm $f
done
答え2
最後の 30 個を除くすべてのファイルを削除するには:
rm `echo " " all-mysql-*.dump | sed -r -e 's/( [^ ]+){0,30}$//'`
1日に1つのバックアップがあり、名前付けスキームがそのまま残っている場合(たとえば、アルファベット順=時系列、ファイル名にスペースはありません)、これは要件を満たします。
あなたは、あなたのコメントのいずれかで具体的に冗談を要求しました。個人的に私は内容を書くことを好む。このライナーは少し危険です(sedが失敗した場合すべて削除されました。)