在 Linux 上删除包含日期戳作为文件名一部分的文件的更简洁方法

在 Linux 上删除包含日期戳作为文件名一部分的文件的更简洁方法

我有一个新要求,要求清除超过 30 天的 MySQL 转储文件。这些文件使用“all-mysql-YYYYMMDD-HHMM.dump”命名约定。这些文件位于 SAN 安装的文件系统上,因此恢复不是问题,但遗憾的是驱动器空间有限并且很快就会填满,因此需要频繁的人工干预。

文件名示例

  • 所有-mysql-20130324-2330.dump
  • 所有-mysql-20130325-2330.dump
  • 所有-mysql-20130326-2330.dump

我的第一个想法是在带有 -mtime +30 的批处理脚本中使用“find”,但是,无法保证修改时间,并且一些较旧的档案可能会逃避清除日期:)

我创建了以下 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}$//'`

如果每天有一个备份,并且命名方案保持原样(即字母顺序=时间顺序,文件名中没有空格),那么这将满足您的要求。

您在其中一条评论中特别要求添加一句俏皮话。就我个人而言,我更喜欢把事情写出来。这个衬垫有点危险(如果 sed 失败,一切被删除)。

相关内容