我不确定这是否会获取当前日期内的过去日期,或者是否只需要 30 或 31 天。
例如
如果当前日期是March 28th
1 个月前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 month
是March 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}'
查找上个月的天数:
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}') |公元前
现在我们发现这两个月之间的差异:
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 个月前”,则需要调整准确的天数。