4

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

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

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

但我怀疑如果有特殊字符或者它找到一个只读文件,这将失败(cron 可能无法以超级用户权限运行)。如果它符合此类文件,我需要它继续。

4

4 回答 4

11

使用 时,空格、制表符、回车或特殊字符-exec rm {} \;应该不会有任何问题,因为直接调用该命令并一次将每个文件的名称传递给它。findrm

该命令不会删除目录,因为您没有将-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命令为您执行删除操作。

于 2012-06-20T13:06:47.247 回答
1

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

我不得不说:要非常小心!你在玩火;)我建议你用一些危害较小的file命令来调试。

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

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

并根据需要设置每个人的权限

于 2012-06-20T12:58:52.280 回答
1

您应该使用-execdir而不是-exec. 更好的是,阅读手册中章节的完整安全注意事项。findfindutils

于 2012-06-20T13:01:21.600 回答
1

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

于 2012-06-20T17:29:58.053 回答