使用 bash 自动删除文件

使用 bash 自动删除文件

我有一个目录 /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 小时前”。)

相关内容