我知道这是一个常见问题,但我不明白所提供的解决方案是如何工作的。每个人都建议将日期更改为距纪元的秒数,然后除以 (24 * 3600) 以获得天数差异。或者使用
if [ $first_date -gt $second_date ]
然而,我不明白的是为什么没有人注意到使用纪元的秒数的明显错误,因为它们甚至在一天之内也会有所不同。或者,如果您考虑特定日期的下午 5:30 和第二天的上午 9:00,秒数之间的差异不会导致 24 小时的差距,因此,它们会被错误地认为是相同的天。
我的使用场景是这样的:我需要清除早于给定天数的日志。因此,expiration_date
我在接受用户输入的天数后形成的 my 是:
expiration_date=$(date -d "-$1 day" + %s)
我通过使用stat
命令获取的文件修改日期如下:
file_date=$( stat -c %Y $entry )
我需要比较这两个日期,如果文件修改日期“小于”到期日期,则清除它们。请在这方面帮助我。
编辑
mtime
我对命令参数的使用感到非常困惑find
。让我们考虑一下我们有以下文件:
Nov15_1
Nov15_2
Nov17_1
Nov17_2
Nov18_1
Nov18_2
Nov19_1
Nov19_2
- 如果我现在在 11 月 19 日
find
使用0
asmtime
参数运行命令,它会为我提供除前四个文件之外的所有文件。$ find /dir/ -type f -mtime 0 -name "Nov*" Nov18_1 Nov18_2 Nov19_1 Nov19_2
- 如果我使用运行它
+0
,它只会给我前四个文件。$ find /dir/ -type f -mtime +0 -name "Nov*" Nov15_1 Nov15_2 Nov17_1 Nov17_2
mtime
如果我们使用变量来表达这一点,说我们想要清除该月第 n 天及更早的日志,并且我们使用as在第 (n+1) 天运行命令+0
,这应该翻译为“1 天前”以及更远”,它实际上是从第 (n-1) 天往前获取文件,即从“2 天往复”开始。这是否意味着无法以某种方式获取 1 天前及以后的文件?的论点0
是将其与今天的文件混合在一起。
编辑
因此,我合并了-daystart
@AdminBee 指出的选项,结果符合我的预期。现在,如果我在第 (n+1) 天运行该命令尝试删除第 n 天及更早的日志,该命令将是
find /dir/ -type f -daystart -mtime +0 -name "Nov*"
无论文件修改时间戳是否在从现在开始的 24 小时内,现在都会将前一天的文件视为落后 1 天,并且还会列出之前的所有其他文件。
答案1
您可能需要提供有关实际用例的更多详细信息。我假设您每天运行一个清理脚本,并且想要删除所有早于 5 天(即 6 天前或更早)的文件。
find
在这些情况下,您可以使用(此处假设 GNU或兼容)将条件文件搜索和删除操作合并为一个命令find
,如下所示
find /start/of/logfile/dir/structure ! -type d -daystart -mtime +5 -delete
如果在当地时间 2019-11-16 22:54:12 运行,将删除最后修改时间在 2019-11-11 00:00:00 之前的非目录文件(因此是 10 号及更早的文件)。
请注意,-daystart
此find
命令的选项应该实现您想要的行为。如果您需要将操作限制为特定文件名部分,则必须添加-name <pattern>
(参见GNU 的文档find
)。
find
另请注意,根据您机器上安装的版本,-delete
操作可能不可用,因此您可能必须改用-exec rm {} \;
。
答案2
man find
, -atime:
...因此,要匹配 -atime +1,文件必须至少在两天前被访问过。
选项-daystart
改变解释:
-daystart
Measure times (for -amin, -atime, -cmin, -ctime, -mmin, and -mtime)
from the beginning of today rather than from 24 hours ago.
touch -d '2019-11-19 0800' thismorning
让您轻松创建测试文件:
]# find -name '*n*g*' -daystart -mtime 0 -ls
Nov 19 08:00 ./thismorning
]# find -name '*n*g*' -daystart -mtime 1 -ls
Nov 18 22:30 ./lastnight
Nov 18 08:30 ./lastmorning
]# find -name '*n*g*' -mtime 0 -ls
Nov 18 22:30 ./lastnight
Nov 19 08:00 ./thismorning
]# find -name '*n*g*' -mtime 1 -ls
Nov 17 22:00 ./lastlastnight
Nov 18 08:30 ./lastmorning
(我剪掉了 -ls 输出字段——只留下了日期和文件名)
]# find -name '*n*g*'; date
./lastnight
./thismorning
./lastlastnight
./lastmorning
Tue Nov 19 10:34:33 UTC 2019
]# find -name '*n*g*' -daystart -mtime 2 -ls
Nov 17 22:00 ./lastlastnight
]#
...因为你在 OP 中混淆了日历日和 24 小时周期。有时我们想要这个,有时又想要那个。
为什么是从纪元开始的秒数?
如果您想知道某件事持续了多长时间,即两个日期的差异,我们的日历有这些不规则之处(月份)。因此,要么使用你的指关节,了解朱利叶斯和奥古斯都皇帝,要么通过几秒使用蛮力。
从 30.7 开始。至 1.9。比 30.1 长三天。到 1.3.,甚至还取决于闰年。
today, 5:30 pm
并且tomorrow 6:00 am
是
- 不同的日子(日历明智)
- 仅相隔半天(一天=24x60x60秒的持续时间)
我从您的expiration_date 中扣除您想要计算的24 小时期限。这意味着在凌晨 1:00,“昨天”的大部分时间都不会受到影响。
我测试并更正了date
命令
]# date -d "-1 day" +%s
1574003538
]# date -d "-0 day" +%s
1574089945
差别是86407,即24x60x60。
(如果有人问我:“你在做什么date -d @1574089945
?”我可以说:“我正在编辑一个命令七秒”)
]# find . -atime 1
./here.sh
]# find . -atime +0 -atime -2
./here.sh
]# ls -l here.sh
-rw-r--r-- 1 root root 154 Nov 16 21:37 here.sh
现在是Nov 18 16:43
。因此,两者之间有整整 24 小时的时间段。