find 和 rm 命令删除了目录内的文件和目录本身

find 和 rm 命令删除了目录内的文件和目录本身

你能检查一下这个命令吗?它正在删除文件和当前目录本身。脚本通过 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 1find(如果支持的话),在这种情况下,您需要单独处理它们(但这可以在一次调用中完成,find因为该实用程序需要任意数量的顶级目录)。

建议,取决于您想要实现的目标:

find /log/dir /log/dir/tmp -maxdepth 1 -type f -mtime +7 -delete

mtime当从目录中添加或删除文件时,目录的 目录会更新。因此,尚不清楚您是否尝试删除目录基于最后修改的时间戳是一个好主意。


对于日志文件的轮换,您还可以考虑使用logrotatecron 作业或一些类似的实用程序。

答案2

您需要定义“7 天以上”的含义。可以在超过 7 天前访问、在超过 7 天前更改或在超过 7 天前创建。所有不同的情况。另外您确定要考虑文件吗目录?

如果您要删除文件和目录,那么第二个命令是多余的,因为它/log/dir/tmp会列在/log/dir.

在这种情况下使用-rrm 是不小心的,并且可能会删除比您想要的更多的内容。 Find 已经递归地列出所有文件/目录,因此您可以通过递归删除来跳到 find 的输出之前。坚持rm -f并让 find 列出要删除的文件。

我认为你想做的很简单: find /log/dir/ -type f -ctime +7 -exec rm -f {} \;

相关内容