如何删除超过X小时的文件

我正在写一个bash脚本,需要删除旧文件。

它目前实现使用:

find $LOCATION -name $REQUIRED_FILES -type f -mtime +1 -delete

这将删除超过1天的文件。

然而,如果我需要一天,比如6小时前的更好的分辨率呢?有没有干净利落的方法,比如使用find和-mtime?

251411 次浏览

-mmin表示分钟。

试着看看手册页。

man find

更多类型。

你的find-mmin选项吗?它可以让你测试自上次修改以来的分钟数:

find $LOCATION -name $REQUIRED_FILES -type f -mmin +360 -delete

或者也可以使用tmpwatch来做同样的工作。phjr也在评论中推荐了tmpreaper

你可以使用这个技巧:1小时前创建一个文件,并使用-newer file参数。

(或者使用touch -t来创建这样的文件)。

适用于SunOS 5.10

 Example 6 Selecting a File Using 24-hour Mode




The descriptions of -atime, -ctime, and -mtime use the  ter-
minology n ``24-hour periods''. For example, a file accessed
at 23:59 is selected by:




example% find . -atime -1 -print








at 00:01 the next day (less than 24 hours  later,  not  more
than one day ago). The midnight boundary between days has no
effect on the 24-hour calculation.

find $PATH -name $log_prefix"*"$log_ext -mmin +$num_mins -exec rm -f {} \;

下面是一个人可以做的事情,以@iconoclast在他们的评论中疑惑的另一个答案。

使用crontab为用户或/etc/crontab创建文件/tmp/hour:

# m h dom mon dow user  command
0 * * * * root /usr/bin/touch /tmp/hour > /dev/null 2>&1

然后使用这个来运行你的命令:

find /tmp/ -daystart -maxdepth 1 -not -newer /tmp/hour -type f -name "for_one_hour_files*" -exec do_something {} \;

如果你的"find"版本中没有"-mmin",那么"-mtime -0.041667"将非常接近"最近一小时内",所以在你的情况下,使用:

-mtime +(X * 0.041667)

如果X表示6小时,则:

find . -mtime +0.25 -ls

有效是因为24小时* 0.25 = 6小时

以下是对我有效的方法(我没有看到上面使用它)

$ find /path/to/the/folder -name '*.*' -mmin +59 -delete > /dev/null

删除所有超过59分钟的文件,同时保持文件夹完整。

如果某人的find没有-mmin,如果他也被困在-mtime只接受整数值的find中,那么如果他认为"比"更老;类似于“不更新于”。

如果我们能够创建一个文件,该文件的mtime为我们的截止时间,我们可以要求find来定位“不更新于”的文件;我们的参考文件。

创建一个具有正确时间戳的文件有点复杂,因为一个没有足够的find的系统可能也有一个能力不强的date命令,可以执行如下操作:

幸运的是,其他的旧工具也可以做到这一点,尽管方式更加笨拙。

要想删除超过6小时的文件,我们首先要找到6小时前的时间。假设6小时是21600秒:

$ date && perl -e '@d=localtime time()-21600; \
printf "%4d%02d%02d%02d%02d.%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'
> Thu Apr 16 04:50:57 CDT 2020
202004152250.57

因为perl语句产生了我们需要的日期/时间信息,所以使用它来创建一个恰好是6小时前的引用文件:

$ date && touch -t `perl -e '@d=localtime time()-21600; \
printf "%4d%02d%02d%02d%02d.%02d\n", \
$d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]'` ref_file && ls -l ref_file
Thu Apr 16 04:53:54 CDT 2020
-rw-rw-rw-   1 root     sys            0 Apr 15 22:53 ref_file

现在我们有了一个六小时前的参考文件,“旧的unix”;“删除超过6小时的所有文件”解决方案;变成了这样的东西:

$ find . -type f ! -newer ref_file -a ! -name ref_file -exec rm -f "{}" \;

清理一下我们的参考文件可能也是个好主意。

$ rm -f ref_file