我必须制作一个cronjob来删除特定目录中超过99天的文件,但我不确定文件名是否由值得信赖的Linux用户制作。我必须期待特殊字符,空格,斜线字符等。
以下是我认为可行的方法:
find /path/to/files -mtime +99 -exec rm {}\;
但是我怀疑如果有特殊字符或者它找到一个只读文件(cron可能无法以超级用户权限运行),这将失败。如果遇到这样的文件,我需要它继续。
答案 0 :(得分:11)
当您使用-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
命令为您执行删除操作。
答案 1 :(得分:1)
如果使用rm
选项运行-f
,无论您是否对文件具有写入权限,您的文件都将被删除(重要的是包含文件夹)。因此,您可以删除文件夹中的所有文件,也可以不删除任何文件。如果要删除子文件夹,还要添加-r
。
我必须说出来:小心翼翼地非常!你正在玩火;)我建议你用file
命令调试一些不那么有害的东西。
您可以通过创建一堆文件来测试这一点,例如:
touch {a,b,c,d,e,f}
并根据需要为每个人设置权限
答案 2 :(得分:1)
您应该使用-execdir
代替-exec
。更好的是,请阅读findutils
手册中的完整Security considerations for find
章节。
答案 3 :(得分:1)
请始终使用rm [opts] -- [files]
,这样可以避免因-rf
之类的文件而导致错误,因为这些文件会被解析为选项。提供文件名时,请结束所有选项。