运维

运维相关知识和内容

Shell中获取指定日期 N 天/月/年前(后)的日期

一、获取 N 天前(后)日期

首先是获取当前日期:

DATE=$(date +%Y%m%d)

此命令就会将 DATE 赋值为 yyyyMMdd的形式,如20160812,%Y%m%d 就是这个日期的格式,相应的还有 %Y%m(年月,如 201909),更多的可以自己搜一搜写法。

获取这个日期 N 天后的日期(${DATE} 可以换成任易日期,如 20160812):

DATE_TMP=$(date -d "${DATE} N days" "+%Y%m%d")

获取这个日期 N 前后的日期(${DATE} 可以换成任易日期,如 20160812):

DATE_TMP=$(date -d "${DATE} N days ago" "+%Y%m%d")

举个例子:

获取当前日期 1 天后的日期:

DATE_TMP=$(date -d "${DATE} 1 days" "+%Y%m%d")

获取当前日期 1 天前的日期:

DATE_TMP=$(date -d "${DATE} 1 days ago" "+%Y%m%d")

举一反三:

获取这个日期 N 月后的日期:

DATE_TMP=$(date -d "${DATE} N month" "+%Y%m%d")

获取这个日期 N 月前的日期:

DATE_TMP=$(date -d "${DATE} N month ago" "+%Y%m%d")

获取这个日期 N 年后的日期:

DATE_TMP=$(date -d "${DATE} N year" "+%Y%m%d")

获取这个日期 N 年前的日期:

DATE_TMP=$(date -d "${DATE} N year ago" "+%Y%m%d")

二、循环处理 N 天内数据

一个简单的处理指定日期 N 天内数据的 Shell 脚本写法:

DATE=$(date +%Y%m%d)
for i in {1..5}
do
    DATE_TMP=$(date -d "${DATE} ${i} days ago" "+%Y%m%d")
    cd /root/backup
    rm -rf *${DATE_TMP}*
done

使用这个脚本,并结合 Linux 的 crontab 命令,就可以轻松实现例如每 N 天将当前日期 5 天内的数据删除。