【问题标题】:cronjob to remove files older than 99 dayscronjob 删除超过 99 天的文件
【发布时间】:2012-06-22 14:45:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我会至少添加一个-type f 来查找选项。
  • 如 find /path/to/files -type f -atime +99 -execdir rm -f {}\;

标签: linux bash cron find rm


【解决方案1】:

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

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

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

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

并根据需要设置每个权限

【讨论】:

  • 好吧,我可以处理这里和那里的小火,我在家里的桌面上有一些虚拟机,我可以毫无后果地玩。但无论如何,如果文件名中有嵌入换行符等特殊字符怎么办?
  • 我认为文件中不能有换行符,而且这个解决方案也应该处理空格。如果有任何问题,您为什么不试一试并报告?
【解决方案2】:

您应该使用-execdir 而不是-exec。更好的是,阅读findutils 手册中的完整Security considerations for find 章节。

【讨论】:

  • 由于 OP 将文件名直接传递给 rm 命令,因此使用 -exec 而不是 -execdir 没有问题。以破折号开头或有空格的文件不会引起任何问题。如果 OP 使用sh -c rm,就会出现问题。最好的办法是使用-delete(如果可用)。
【解决方案3】:

当您使用-exec rm {} \; 时,空格、制表符、回车或特殊字符应该不会有任何问题,因为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 命令为您执行删除操作。

【讨论】:

  • David W. 好的,但文件的路径不会指向某些人的目录,我相信(或希望不是),因为我不会真的在那里。所以到目前为止我可以收集到的内容:find /path/to/files -atime +99 -execdir rm -f {}\;
  • 使用-execdir 将不起作用。它将从找到文件的目录执行rm命令,但{}不会被修剪,因此文件名将无效。顺便说一句,我在命令中添加了-type f,所以我们只讨论文件。
  • @user1469220 还有一件事。它不是标准的 Unix 查找参数,但可用于许多查找命令。您也许可以使用-delete 参数而完全忘记-exec。请在上面的答案中查看我的 cmets。
【解决方案4】:

请始终使用rm [opts] -- [files],这样可以避免出现-rf 等文件的错误,否则wiich 会被解析为选项。提供文件名后,结束所有选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多