我有一个目录 /backup,其中包含其他目录,其中包含每日备份。这些目录按名称和日期 (BACKUP_date) 排序。我之前使用的几行 bash 脚本一直工作到新月初,然后由于一些不可预见的情况而停止。这是我以前使用的
#!/bin/bash
ndate=$(date "+%Y%m%d")
ndays=8
ddate=$((ndate-ndays))
cd /backup || exit
rm -rf BACKUP_$ddate
我怎样才能修改它,使它变得更加智能。
答案1
如果你回应这些价值观,很明显哪里出了问题:
a=$(date "+%Y%m%d")
echo $a
20210906
b=$(($a-8))
echo $b
20210898
八月没有第98天。
因此,更好的方法是date
进行计算:
b=$(date "+%Y%m%d" --date='8 days ago')
echo $b
20210829
答案2
不要将时间或 YMD 日期视为普通整数;它们的值范围存在差距,普通整数运算无法解释它们。例如,如果您的脚本在 9 月 6 日运行,它会将“ddate”计算为 8 月第九十八届, 因为2021_09_06 - 8 = 2021_08_98
。
有三种方法可以实现这一点:
日期格式是整数
这%s
格式将为您提供日期+时间作为“Unix 时间戳”,以秒为单位,自 1970 年 1 月 1 日以来。这是一个整数,您可以简单地在其中添加或减去秒数:
ntime=$(date +%s)
ndays=8
dtime=$(( ntime - ndays*86400 ))
获得“8天前”的时间戳后,您可以要求date
使用以下命令对其进行格式化-d @12345
:
ddate=$(date -d "@$dtime" +%Y-%m-%d)
让我们date
来计算一下
如果要获取 8 天前的日期,可以直接使用以下命令获取-d "8 days ago"
:
ndays=8
ddate=$(date -d "${ndays} days ago" +%Y-%m-%d)
(这可以堆叠,但方式稍微不太明显,例如“4 天前 12 小时前”而不是仅仅“4 天 12 小时前”。)