Linuxでファイル名の一部として日付スタンプを含むファイルを削除するためのよりきれいな方法

Linuxでファイル名の一部として日付スタンプを含むファイルを削除するためのよりきれいな方法

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が失敗した場合すべて削除されました。)

関連情報