命令:查找和删除日志文件——深入解释

Cyr*_*ril 3 linux logs find

find $LOG_PATH -type f -mtime +60 -print -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

上面的命令删除日志文件,我确实阅读了每个命令的手册,但不太理解。

任何人都可以用简单的解释来解释这一点吗?

谢谢!

Hax*_*iel 5

感谢您尝试首先使用手册理解命令。我将通过参考位于此处的手册的每个部分来尝试解释该命令的工作原理。

该命令主要执行以下操作。1) 它在 $LOG_PATH 变量指定的路径内查找已被修改超过 60 天的常规文件。2) 对于每个有效结果,它打印文件名,然后rm在文件上执行命令。

详细分解如下。find 命令的基本语法如下所示(为清楚起见,省略了一些高级选项):

find [starting-point...] [expression]
Run Code Online (Sandbox Code Playgroud)

起点是一个路径,例如/home 或documents/。手册上说:

GNU find 根据优先级规则,通过从左到右评估给定的表达式来搜索以每个给定起点为根的目录树...

在您的情况下,此起点由变量 $LOG_PATH 指定。此变量应包含一个有效路径值。

现在 find 知道在哪里查找文件,下一步是评估给定的表达式。再次,参考手册:

起始点列表之后的命令行部分是表达式。这是一种查询规范,描述了我们如何匹配文件以及我们如何处理匹配的文件。

为简单起见,我们将考虑出现在您的命令中的两种类型的表达式:测试和操作。

测试返回 true 或 false 值,通常基于我们正在考虑的文件的某些属性。

动作有副作用(例如在标准输出上打印一些东西)并返回真或假,通常取决于它们是否成功。

这种情况下的测试是-type f和-mtime +60表达式。该-type测试检查文件是否属于某种类型。-type f检查文件是否为常规文件。其他变体包括-type d检查目录和-type l查找符号链接。

该-mtime +60测试是多一点参与。它检查文件的数据/内容是否在 60 多天前被修改。这里有一个复杂之处:find忽略计算修改时间所涉及的分数。因此,文件实际上需要在 61*24 小时前修改才能成功通过此测试。时间是从执行命令的时间开始计算的,不是按日历天数计算的。

find命令中的下一个表达式是一个操作:-print。通过该-print操作,通过-type和-mtime测试的每个文件的文件名将打印到标准输出(每行一个文件)。这基本上为您提供了以下结果find:一个文件列表,这些文件通过了您指定的测试条件。

find命令的最后一部分也是一个操作:-exec。该-exec操作对 的每个结果运行指定的命令find。在您的情况下,这是rm删除文件的命令。花括号 ( {}) 指定要替换文件名的位置。这会产生一个形式为 的命令rm /path/to/target/file。末尾的分号指定由 指定的命令-exec应对每个匹配的文件执行一次。因为分号也是 shell 的一个特殊字符,所以它通过加反斜杠前缀来转义。