3

我正在构建一个用于备份数据库的 bash 脚本。我已经设置了一个 cron 作业来每天运行这个脚本,并且我已经可以根据以下格式转储 .sql 文件:

YYYYMMDD_HHMMSS-databasename.sql

考虑到时间戳格式的名称,我想构建另一个 bash 脚本来解析YYMMDD文件名部分并选择上周的所有每日文件。这个新的 bash 脚本将每周运行一次。

如何使用正则表达式将这些数字解析为日期?

4

4 回答 4

2

这是一个完整的解决方案,请尝试这样做:

没有正则表达式偏移量削减(假设您的示例是所有文件的相同格式,就像脚本在运行时所做的那样crontab):

cd /path/to/dumps
str='20130321_145907-databasename.sql'
for i in {7..14}; do
    curfile=$(date -d ${str:0:8} -d "$i days ago" '+%Y%m%d')*
    if [[ -s $curfile ]]; then
        # do something with "$curfile"
    fi
done

如果你真的需要一个正则表达式

cd /path/to/dumps
str='20130321_145907-databasename.sql'
if [[ $str =~ ^([0-9]{8})_[0-9]{6} ]]; then
    for i in {7..14}; do
        curfile=$(date -d ${BASH_REMATCH[1]} -d "$i days ago" '+%Y%m%d')*
        if [[ -s $curfile ]]; then
            # do something with "$curfile"
        fi
    done
fi

笔记

  • 注意最后*一行curfile=
于 2013-03-21T13:56:31.357 回答
2

使用 RegEx 从文件名中选择日期部分:

^(20[12]\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])_\d+-\w+\.sql$

在这里解释正则表达式:http ://regex101.com/r/iU7wL5

使用正确的时间验证更新

^(20[12]\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])_([01]\d|2[0-3])[0-5]\d[0-5]\d-\w+\.sql$

解释演示:http ://regex101.com/r/yV1dD7

注意:这适用于 2010-2029 范围内的日期,并将文件名验证为您的输出格式

于 2013-03-21T14:29:11.463 回答
1

使用 bash 3+:

$ file=20130321_foo.log
$ [[ $file =~ ^[0-9]{8} ]]
$ echo ${BASH_REMATCH[0]}
20130321
$
于 2013-03-21T14:00:08.870 回答
0

那这个呢?

LAST_WEEK_BEG=$(date --date="-7 days" +%Y%m%d)
LAST_WEEK_END=$(date --date="-14 days" +%Y%m%d)


if [ $YOUR_DATE -ge "$LAST_WEEK_BEG" ] && [ $YOUR_DATE -le "$LAST_WEEK_END" ]; then
   do things
fi
于 2013-03-21T14:09:48.263 回答