find $LOG_PATH -type f -mtime +60 -print -exec rm {} \;
上面的命令删除日志文件,我确实阅读了每个命令的手册,但不太理解它。
谁能用简单的解释来解释这一点?
谢谢!
答案1
感谢您首先尝试使用手册来理解该命令。我将尝试通过参考该命令的每个部分来解释该命令的工作原理手册位于此处。
该命令主要执行以下操作。 1) 它在 $LOG_PATH 变量指定的路径内查找 60 天前修改过的常规文件。 2) 对于每个有效结果,它打印文件名,然后rm
在文件上执行命令。
详细分解如下。 find 命令的基本语法如下所示(为了清楚起见,省略了一些高级选项):
find [starting-point...] [expression]
起点是一个路径,例如/home 或documents/。手册说:
GNU find 根据优先级规则,通过从左到右评估给定的表达式来搜索以每个给定起点为根的目录树...
在您的情况下,该起点由变量 $LOG_PATH 指定。该变量应包含有效路径的值。
既然 find 知道在哪里查找文件,下一步就是评估给定的表达式。再次回到手册:
起始点列表之后的命令行部分是表达式。这是一种查询规范,描述我们如何匹配文件以及我们如何处理匹配的文件。
为简单起见,我们将考虑命令中出现的两种类型的表达式:测试和操作。
测试返回 true 或 false 值,通常基于我们正在考虑的文件的某些属性。
操作具有副作用(例如在标准输出上打印某些内容)并返回 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 来说也是一个特殊字符,所以可以通过在前面加上反斜杠来对其进行转义。
答案2
$LOG_PATH
是一个变量,可能包含要搜索的路径,例如:/home/folder1/folder2`
-type f
:仅查找文件,不查找文件夹或其他
-mtime
: 上次修改是在 60 多天前。
-print
:打印此命令的输出,如果未明确指定,则应使用默认值。
-exec rm {} \;
:在结果的每一行上执行命令 - 由换行符分隔(实际上是在该命令找到的每个文件上),删除这些文件\;
是必须的。