![除了使用 Bash、通过 cron 作业查找之外,有没有更好的方法来删除 5 分钟前的文件?](https://linux22.com/image/1594701/%E9%99%A4%E4%BA%86%E4%BD%BF%E7%94%A8%20Bash%E3%80%81%E9%80%9A%E8%BF%87%20cron%20%E4%BD%9C%E4%B8%9A%E6%9F%A5%E6%89%BE%E4%B9%8B%E5%A4%96%EF%BC%8C%E6%9C%89%E6%B2%A1%E6%9C%89%E6%9B%B4%E5%A5%BD%E7%9A%84%E6%96%B9%E6%B3%95%E6%9D%A5%E5%88%A0%E9%99%A4%205%20%E5%88%86%E9%92%9F%E5%89%8D%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在通过 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 -f
为ls -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
。我相信您可以指定任意目录路径,以便将其用于日志文件以外的其他用途。