Cron作业删除3天以上的文件


21

我需要在3个不同的目录中使用cron作业删除3天以上的文件。(这3个目录是一个父目录的孩子/a/b/c/1/a/b/c/2/a/b/c/3)可以这样用在crontab一行来完成?

Answers:


26

这很容易(尽管请注意,由于创建时间仅在使用特殊工具的某些文件系统上可用,所以修改时间超过了3天):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

取出#的前-delete一旦你确定它就是找到你要删除的文件。

要让它由cron运行,我可能只是创建一个可执行脚本(#!bin/sh在文件的第一行添加一个shebang- 并使用使其成为可执行文件chmod a+x),然后将其放在适当的cron目录中,例如/etc/cron.daily/etc/cron.weekly。当然,您不需要更具体的时间表,并且这些目录位于发行版中。

更新资料

如下所述,该-delete选项find不是很便携。POSIX兼容方法是:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

#如果确定文件正确,请再次删除。

更新2

引用斯特凡·查泽拉斯的评论如下:

请注意,它-exec rm {} +具有-delete(没有可用的)竞争条件漏洞。因此,请勿在其他人可写的目录上使用它。一些发现还具有-execdir缓解这些漏洞的功能。


谢谢!有没有一种方法可以先指定父目录,然后再指定子目录,这样就/a/b/c/不必为每个选项都指定目录了?
KingKongFrog

当然,您可以在POSIX Shell中进行操作/a/b/c/[12],但这仅在子目录具有单个字母名称的情况下才真正合适。在bash你可以做到的/a/b/c/{1,2}。当然,然后必须为脚本加上一行,#!/bin/bash或者如果您使用的是crontab,则需要确保已将其配置为使用bash(如果不是,我不建议您进行更改)。
Graeme 2014年

2
括号扩展是csh的功能,并且ksh,bash,zsh和fish也受其支持,因此您可以选择多种shell。kshbash并且zsh在全局变量中也有交替运算符。请注意,它-exec rm {} +具有-delete(没有可用的)竞争条件漏洞。因此,请勿在其他人可写的目录上使用它。一些发现还具有-execdir缓解这些漏洞的功能。
斯特凡Chazelas

难道rm -f不处理错误默默地,从而处理与任何可能的竞争条件-exec
Acumenus


9

您最好使用 tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.

2
tmpwatch已被分叉到tmpreaper,(至少在Debian上)似乎是它的替代者。
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.