date 命令中的“1 个月前”选项如何工作?

date 命令中的“1 个月前”选项如何工作?

我不确定这是否会获取当前日期内的过去日期,或者是否只需要 30 或 31 天。

例如

如果当前日期是March 28th1 个月前February 28th,那么 1 个月前会发生什么March 30th

设想

我想每天备份一些文件,脚本会在当前日期内以$(date +%Y%m%d)格式保存这些文件,例如20150603_bckp.tar.gz,然后当下个月到来时,删除1个月前的所有文件,除了1号和15号的文件,所以这是我的情况:

past_month = $(date -d "-1 month" +%Y%m%d)
day = $(date +%d)
if [ "$day" != 01 ] && [ "$day" != 15 ]
then
    rm /path/of/files/${past_month}_bckp.tar.gz
    echo "Depuration done"
else
    echo "Keep file"
fi

但我想知道,当日期是 30 日、31 日甚至是过去的 2 月的例子时会发生什么?它会保留那些文件吗?或者删除第一天的文件?

当 31 号时,净化将执行,所以如果过去一个月只有 30 天,这会删除第 1 天的文件吗?

我希望我暗示过。

答案1

- 1 month将从月份数字中减一,然后如果结果日期无效(February 30例如 ),则对其进行调整以使其有效。也是,December 31 - 1 month不是December 1十一月的一天,并且March 31 - 1 monthMarch 3(除非在闰年执行)。

这里引用的是信息页对于 Gnu date(这是date实现此语法的版本),其中包括一个使算术更加健壮的好建议:

单位中的模糊可能会导致相关项目出现问题。例如,2003-07-31 -1 month可能计算为 2003-07-01,因为 2003-06-31 是无效日期。为了更可靠地确定上个月,您可以询问当月 15 日之前的月份。例如:

    $ date -R
    Thu, 31 Jul 2003 13:02:39 -0700
    $ date --date='-1 month' +'Last month was %B?'
    Last month was July?
    $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
    Last month was June!

另一个警告,也引自信息页面:

另外,在围绕时钟变化(例如夏令时跳跃)操作日期时要小心。在某些情况下,它们会在时钟上增加或减少多达 24 小时,因此 在开始日历计算之前,通过将TZ环境变量设置为 来采用通用时间通常是明智的做法。UTC0

答案2

与其依赖文件名来清除备份文件,不如依赖它们的时间元数据更安全。

例如,您可以使用以下命令删除所有超过 30 天的文件:

/usr/bin/find /path/to/your/files -type f -ctime +30 -delete

作为免费的奖励,每天运行此程序将允许您连续一个月保存备份文件,从而实现更好的磁盘空间管理。

要保留第 1 个或第 15 个文件,您可以将它们存储在另一个目录中,或者使用 -not -name 选项更新 find 命令。

答案3

您可以尝试通过以下方式查看日期是如何工作的:

date -d "$(date -d "Mar 31 2019" +%F) +1 month ago"
Sun Mar  3 00:00:00 EET 2019

所以我认为,根据上个月当前(不是当前,如果是三月),从当前月份减少上个月的天数。

您可以尝试使用以下语法来删除早于几天的文件(在下面的示例中为 31 天)。一行解决问题(这是一种简单的方法)。

find /path/to/folder/with/arhives/ -mindepth 1 -mtime +31 -delete

对于更详细的方法,您还可以执行以下操作: 1. 查找当前月份的天数:

cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}'
  1. 查找上个月的天数:

    echo "$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')-"$( cal $(date -d "+1 个月前" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | awk '{print $NF}') |公元前

  2. 现在我们发现这两个月之间的差异:

    echo "$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')-"$( cal $(date -d "+1 个月前" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | awk '{print $NF}') |公元前

现在让我们为这 3 个步骤分配一些变量。步骤 1 变量名称:FCM 步骤 2 变量名称:FLM 步骤 3 变量名称:DCL

FCM=$(cal $(date +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
FLM=$(al $(date -d "+1 month ago" +%m) $(date +%y) | egrep -v "$(date +%y)|Su" | xargs | awk '{print $NF}')
DCL=$(echo "$FCM-$FLM" | bc)

验证 $DCL 是否等于 0(零)并根据 $FCM 和 $FLM 之间的差异进行删除:

if [ $DCL -ne 0 ]; then
    if [ $DCL -lt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    elif [ $DCL -gt 0 ]; then
        find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$(echo "$DCL+$FLM" | bc) -delete
    fi
else
    find /path/to/folder/with/arhives/ -mindepth 1 -mtime +$FLM -delete
fi

您还可以将变量添加到“/path/to/folde/with/arhives/”。

结论:如果您想删除早于一个月(准确)的文件,如果您使用“date”命令和“+1 个月前”,则需要调整准确的天数。

相关内容