没有这样的文件或目录 用 find -exec rm -f {} \;

lig*_*ing 5 ssh find

我有一个每天运行的清除作业来清理超过 30 天的日志。

find /dir/app/logs -mtime +30 -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

我正在将我们的工作从 cron 转移到第 3 方调度产品 Automic。自从移动这项工作以来,我不断收到错误“没有这样的文件或目录”随机。收到错误后在提示符下运行find命令,如果不加-exec rm -f {} \;,总是不返回结果,运行成功。长话短说,我无法重现该错误。

该作业通过执行以下命令来运行:

ssh user@server "find /dir/app/logs -mtime +30 -exec rm -f {} \;"
Run Code Online (Sandbox Code Playgroud)

针对远程服务器。

我测试了各种解决方案,但没有任何运气。最初,该命令在没有 -f 的情况下运行。据我所知,添加 -f 应该可以抑制错误,但我没有看到这种情况发生。我尝试替换 -exec rm {} \; 与 -delete ,但这也没有帮助。

目前我正在测试改变 \; 按照此处的建议添加到 +:

find - exec rm 与 -delete

预先感谢您对正在发生的事情的任何了解。

lig*_*ing 3

经过一段时间的休息和更多的谷歌搜索后,这个解决方案可能会解决这个问题:

find /usr/dir/logs/ -mindepth 1 -mtime +45 -delete
Run Code Online (Sandbox Code Playgroud)

它似乎find包含rm父目录并尝试首先删除它,这解释了为什么它有时有效,然后会抛出丢失文件/目录错误。使用-delete效果很好,添加-mindepth 1导致它跳过父级。

要保留不应删除的子目录,请添加“-type f仅查看保留这些文件”的文件。此外,还有一种情况需要忽略特定文件。这似乎适用于这种情况:

find /usr/dir/logs/ -mindepth 1 -type f \( ! -name "ignoreme*" \) -mtime +30 -delete
Run Code Online (Sandbox Code Playgroud)

  • 此外,使用“-delete”,它将对目录结构进行深度优先遍历。这意味着,如果您_do_删除目录(显然您不使用`-type f`),那么您删除的任何目录都已经被先前处理过(`find`不会再次尝试访问该目录)。您可以使用“-deep”强制进行深度优先遍历,而无需使用“-delete”。 (4认同)