编辑

编辑

我知道这是一个常见问题,但我不明白所提供的解决方案是如何工作的。每个人都建议将日期更改为距纪元的秒数​​,然后除以 (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使用0asmtime参数运行命令,它会为我提供除前四个文件之外的所有文件。
    $ 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 号及更早的文件)。

请注意,-daystartfind命令的选项应该实现您想要的行为。如果您需要将操作限制为特定文件名部分,则必须添加-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 小时的时间段。

相关内容