我正在构建一个用于备份数据库的bash脚本。我已经设置了一个cron作业来每天运行这个脚本,我已经可以按照以下格式转储.sql文件:
YYYYMMDD_HHMMSS-databasename.sql
考虑时间戳格式的名称,我想构建另一个bash脚本,它将解析YYMMDD
文件名部分并选择上周的所有日常文件。这个新的bash脚本将每周运行一次。
如何使用正则表达式将这些数字解析为日期?
答案 0 :(得分: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=
答案 1 :(得分: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范围内的日期,并根据输出格式验证文件名
答案 2 :(得分:1)
使用bash 3 +:
$ file=20130321_foo.log
$ [[ $file =~ ^[0-9]{8} ]]
$ echo ${BASH_REMATCH[0]}
20130321
$
答案 3 :(得分: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