你能检查一下这个命令吗?它正在删除文件和当前目录本身。脚本通过 cron 运行。
目录:
/log/dir/
/log/dir/tmp/
脚本中的命令:
find /log/dir/ -mtime +7 -name "*" -exec rm -rf {} \;
find /log/dir/tmp -mtime +7 -name "*" -exec rm -rf {} \;
测试:运行来find /log/dir/ -mtime +7 -name "*"
检查文件,我得到了结果。运行脚本后,该文件被删除。几天后,文件夹也被删除(dir in/log/dir/
和 tmp in /log/dir/tmp
)。
预期应该是仅删除提供的路径内超过 7 天的文件/目录。
Linux Redhat6.5
答案1
如果您想find
仅删除常规文件而不删除目录,请绝对确保您使用-type f
.这将阻止处理引用目录(或任何非常规文件)的路径名。自上次修改时间戳满足删除标准以来,目录已被删除。
另外,如果您要删除文件,请不要使用,rm -r
因为递归到常规文件没有意义。对于大多数find
实现,您还可以选择使用-delete
而不是-exec rm
.
这-name "*"
是一个无操作,可以删除,因为每一个名字相匹配*
。
如果您运行 find over /log/dir
,则无需运行它,/log/dir/tmp
因为后者将作为前者的一部分进行处理。如果您只想在这两个目录中查找,而不是在子目录中查找,请添加-maxdepth 1
到find
(如果支持的话),在这种情况下,您做需要单独处理它们(但这可以在一次调用中完成,find
因为该实用程序需要任意数量的顶级目录)。
建议,取决于您想要实现的目标:
find /log/dir /log/dir/tmp -maxdepth 1 -type f -mtime +7 -delete
mtime
当从目录中添加或删除文件时,目录的 目录会更新。因此,尚不清楚您是否尝试删除目录基于最后修改的时间戳是一个好主意。
对于日志文件的轮换,您还可以考虑使用logrotate
cron 作业或一些类似的实用程序。
答案2
您需要定义“7 天以上”的含义。可以在超过 7 天前访问、在超过 7 天前更改或在超过 7 天前创建。所有不同的情况。另外您确定要考虑文件吗和目录?
如果您要删除文件和目录,那么第二个命令是多余的,因为它/log/dir/tmp
会列在/log/dir
.
在这种情况下使用-r
rm 是不小心的,并且可能会删除比您想要的更多的内容。 Find 已经递归地列出所有文件/目录,因此您可以通过递归删除来跳到 find 的输出之前。坚持rm -f
并让 find 列出要删除的文件。
我认为你想做的很简单: find /log/dir/ -type f -ctime +7 -exec rm -f {} \;