除了使用 Bash、通过 cron 作业查找之外,有没有更好的方法来删除 5 分钟前的文件?

除了使用 Bash、通过 cron 作业查找之外,有没有更好的方法来删除 5 分钟前的文件?

我正在通过 cron 作业使用 Bash 脚本来删除 5 分钟前的文件。有没有比这更好的方法?

有没有一种方法可以更有效地监视我的文件系统,并在满足某个条件(例如“文件超过 5 分钟”)后获得回调?

背景:我们的扫描仪不是很“智能”,只支持将扫描件上传到 FTP 服务器。虽然这不安全,但目前没有更好的方法。为了防止 FTP 服务器成为可能有价值的文档的宝库,我希望在它们 5 分钟后立即删除它们。

第一个想法是每 5 分钟运行一次 cron 作业,删除该目录中的所有文件。明显的缺点是,如果有人在 cron 作业运行之前扫描文档,他们就会丢失扫描结果。这可能不是问题,因为您可以重新扫描文档,但这很烦人。

下一个方法是每 5 分钟运行一次 cron 作业,检查文件是否超过 5 分钟,如果是,则删除它。这将使文件的理论最大寿命约为 10 分钟。这种方法有效,但感觉有点像黑客行为。

那么还有更好的方法吗?

答案1

在很多情况下,没有什么比调用 Bash 脚本的基本 cron 作业更好的了。

为什么您认为使用 cron 作业是一个“糟糕”的解决方案?除非此方法会给您的系统带来实际问题,否则将其更改为其他方法只会使本质上简单的过程变得过于复杂。

世界上绝大多数系统都使用类似这样的 cron 作业。通过 Bash 和 cron 作业使用 find 完全没问题。

也就是说,这就是我通过 crob 作业处理您描述的任务的方式……

首先,你可以使用find像这样:

find /path/to/the/files -maxdepth 1 -type f -mmin +5 -type f -regextype posix-extended -iregex '.*\.(PDF|JPG|TIFF)$' -exec rm -f {} \;

然后您可以像这样测试该命令;替换rm -fls -la

find /path/to/the/files -maxdepth 1 -type f -mmin +5 -type f -regextype posix-extended -iregex '.*\.(PDF|JPG|TIFF)$' -exec ls -la {} \;

这是专门在路径中查找-type f超过 5 分钟的文件( -mmin +5),其中文件扩展名为 PDF、JPG 和 TIFF( ) ,仅在该目录中查找()。-regextype posix-extended -iregex '.*\.(PDF|JPG|TIFF)$/path/to/the/files-maxdepth 1

您可以根据需要添加其他文件扩展名,或者直接将其全部删除,以便扫描目录中的任何内容。但我不建议这样做,因为您可能会删除不该删除的内容;只需根据需要添加所需的扩展名即可。

请随意测试并根据需要进行调整。我建议将此代码放在 Bash 脚本文件中,然后通过 cron 作业运行该 Bash 脚本文件。如下所示:

#!/bin/bash -l
find /path/to/the/files -maxdepth 1 -type f -mmin +5 -type f -regextype posix-extended -iregex '.*\.(PDF|JPG|TIFF)$' -exec rm -f {} \;

答案2

你可以使用inotifiywait被告知在某个目录中创建了一个文件,然后启动一个后台进程,该进程休眠 5 分钟,然后删除该文件。

但是,这种解决方案不太可靠,因为如果出于某种原因您遗漏了某个文件,它将永远留在磁盘上。基于的解决方案find最终将清理残留文件,即使由于某种原因运行失败。

答案3

尝试一下logrotate。我相信您可以指定任意目录路径,以便将其用于日志文件以外的其他用途。

相关内容