Linux cronjob删除超过99天的文件
我必须做一个cronjob来删除特定目录中超过99天的文件,但我不确定文件名是否由值得信任的Linux用户创建。我必须使用特殊字符、空格、斜杠字符和其他字符 以下是我认为可行的方法: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,则无论您是否对该文件具有写入权限,您的文件都将被删除(重要的是
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
,则会出现问题。最好的选择是使用-删除(如果可用)。