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


8

我有一个新要求,要清除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

3
看起来对我来说已经足够了,而且我看不到比您实际使用的更简单的日期转换方法。:)
天衣

@tink-谢谢。不禁想到有一个统一的解决方案。我更关心其他维护者,他们在JavaLand中的生活要比BASHland多。也许唯一的问题是“ 2038年”问题:)
TP

2
这不是logrotate更清洁的解决方案吗?
ott--

2
对于此类情况,也应采取保护措施(由于某种原因而没有新备份时,请勿删除旧备份)。
弗罗斯特斯

@ott-如果它在用户环境中工作良好,则可以选择。不幸的是,我们(应用程序工程师)没有任何root或su特权,因此,如果有任何特权进入syslog或需要任何其他超级用户priv,我们将处于黑暗之中。这真是令人um目结舌,但却是统治政策:(
TP

Answers:


3

删除除最后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

选项1不会考虑可能会导致30个以上文件的临时备份,但是选项2是我希望实现的目标(更简洁的脚本)。但是,发布的脚本重构确实产生了错误,因此我将日期分配行更改为d = $(date -d @ $(($(date +%s)-30 * 86400))+%Y%m%d ),其工作原理与原始帖子中的脚本相同。
TP

date -d在OS X上不起作用,但是-r在gnu date中似乎也有不同的含义。
2013年

对。另一个GNU vs BSD陷阱:)
TP

1

如果要删除除最后30个文件以外的所有文件,请执行以下操作:

rm `echo " " all-mysql-*.dump | sed -r -e 's/( [^ ]+){0,30}$//'`

只要每天进行一次备份,并且命名方案保持原样(即字母顺序=时间顺序,文件名中没有空格),就可以满足您的要求。

您在其中一条评论中特别要求单线。我个人比较喜欢写东西。这个衬里有点危险(如果sed失败,一切都会被删除)。


当前,每天可能有多个备份(转储)以刷新质量检查和本地环境。也许将其说明清楚并保证安全是最好的方法。
TP

然后,您最多可以存储40或50个文件(但是您可以负担得起许多存储空间)。如果您有用于这些备份的单独文件系统,则甚至可以统计可用空间,并且在没有足够空间可用时仅保留第一个备份。
弗罗斯特斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.