Linux cronjob删除超过99天的文件

Linux cronjob删除超过99天的文件,linux,bash,cron,find,rm,Linux,Bash,Cron,Find,Rm,我必须做一个cronjob来删除特定目录中超过99天的文件,但我不确定文件名是否由值得信任的Linux用户创建。我必须使用特殊字符、空格、斜杠字符和其他字符 以下是我认为可行的方法: find /path/to/files -mtime +99 -exec rm {}\; 但我怀疑,如果存在特殊字符或找到只读文件(cron可能无法以超级用户权限运行),则此操作将失败。如果遇到这样的文件,我需要它继续运行。如果使用-f选项运行rm,则无论您是否对该文件具有写入权限,您的文件都将被删除(重要的是

我必须做一个cronjob来删除特定目录中超过99天的文件,但我不确定文件名是否由值得信任的Linux用户创建。我必须使用特殊字符、空格、斜杠字符和其他字符

以下是我认为可行的方法:

find /path/to/files -mtime +99 -exec rm  {}\;

但我怀疑,如果存在特殊字符或找到只读文件(cron可能无法以超级用户权限运行),则此操作将失败。如果遇到这样的文件,我需要它继续运行。

如果使用
-f
选项运行
rm
,则无论您是否对该文件具有写入权限,您的文件都将被删除(重要的是包含该文件的文件夹)。因此,您可以删除文件夹中的所有文件,也可以不删除任何文件。如果要删除子文件夹,请添加
-r

我不得不说:要非常小心!你在玩火;)我建议您使用危害较小的工具进行调试,如
文件
命令

您可以通过创建一组文件来测试这一点,例如:

touch {a,b,c,d,e,f}

并根据需要对每个文件设置权限

您应该使用
-execdir
而不是
-exec
。更好的是,当您使用
-exec rm{}时,请阅读
findutils
手册中的完整章节
,您不应该在空格、制表符、返回或特殊字符方面有任何问题,因为
find
直接调用
rm
命令,并将每个文件的名称一次一个地传递给它

该命令不会删除目录,因为您没有将
-r
参数传递给它,而且您可能也不想这样做。这可能会有点危险。您可能还希望包含
-f
参数,以便在没有写入权限的情况下执行强制操作。以root用户身份运行cron脚本,您应该不会有问题

我唯一担心的是,你可能会碰到一个你不想删除的文件,但在过去的100天里没有被修改过。例如,在工作中停止自毁序列的密码。在过去的100天里,这个文件很可能没有被修改过,但一旦那个自毁序列开始,你就不会希望因为密码丢失而责怪那个

好的,更合理的可能是使用但很少修改的应用程序。也许某人的简历因为目前的工作而没有更新,等等

所以,要小心你的假设。文件在100天内没有被修改并不意味着它没有被使用。更好的标准(尽管仍有疑问)是该文件是否在过去100天内被访问。也许这是最后的命令:

 find /path/to/files -atime +99 -type f -exec rm -f {}\;

还有一件事。。。 某些
find
命令具有
-delete
参数,可以使用该参数代替
-exec rm
参数:

 find /path/to/files -atime +99 -delete
这将同时删除找到的目录和文件


还有一个小建议:在第一周,保存日志文件中找到的文件,而不是删除它们,然后检查日志文件。这样,您可以确保没有删除重要的内容。一旦你高兴地发现日志文件中没有你不想碰的东西,你可以删除这些文件。一周后,如果您对不打算删除任何重要内容感到满意,您可以恢复
find
命令为您执行删除操作。

请始终使用
rm[opts]-[files]
,这将避免出现类似
-rf
的文件错误,否则wiich将被解析为选项。当您提供文件名时,请结束所有选项。

好吧,我可以处理这里和那里的一些小火灾,我在家里的桌面上有一些虚拟机,我可以毫无后果地使用它们。但无论如何,如果文件名中有特殊字符,比如嵌入的换行符,该怎么办?我认为文件中不能有换行符,而且这个解决方案还应该处理空白。如果有任何问题,你为什么不试一试并报告呢?我至少会添加一个
-typef
来查找的选项。如find/path/to/files-typef-atime+99-execdir-rm-f{};好的,但是文件的路径不会是到某些人的目录,我相信(或者希望不是),因为我不会真的在那里。到目前为止,我可以收集到以下信息:find/path/to/files-atime+99-execdir-rm-f{}\;使用
-execdir
无效。它将从找到文件的目录执行
rm
命令,但是
{}
不会被修剪,因此文件名将无效。顺便说一下,我在命令中添加了
-typef
,所以我们只讨论文件。@user1469220还有一件事。它不是标准的Unix find参数,但在许多find命令中都可用。您可以使用
-delete
参数,完全忘记
-exec
。请参阅上面我的回答中的注释。由于OP将文件名直接传递给
rm
命令,因此使用
-exec
而不是
-execdir
没有问题。以破折号开头或有空格的文件不会导致任何问题。如果OP使用的是
sh-crm
,则会出现问题。最好的选择是使用
-删除
(如果可用)。