查文件名必须加引号,否则通配符会被 shell 提前展开;-mtime 单位是24小时,-mtime -1 表示24小时内修改,-mtime 0 等价于 -mtime -1,-mtime +7 表示8天前或更早修改。

查文件名必须加引号,否则通配符会被 shell 提前展开
不加引号时,find . -name *.log 中的 *.log 会被当前 shell 展开成当前目录下已存在的匹配文件(比如 access.log error.log),再传给 find,导致实际执行变成 find . -name access.log error.log —— 这会报错或漏匹配。正确写法是用单引号或双引号包裹:find . -name "*.log" 或 find . -name '*.log'。
忽略大小写的场景更需注意:-iname 和 -name 行为一致,只是前者不区分大小写,但同样要加引号,例如:find /var/log -iname "*.LOG" 能匹配 syslog、APP.LOG 等。
按修改时间搜索时,-mtime -n 和 +n 容易理解反
-mtime 的单位是“24 小时”,不是“天”,且计算起点是“现在减去 n×24 小时”。所以:
-
-mtime -1:表示“最后 24 小时内被修改过”(即修改时间 > now - 24h) -
-mtime 0:等价于-mtime -1,也指“今天修改的” -
-mtime +7:表示“8 天前或更早修改的”(即修改时间 -
-mtime 7:表示“恰好 7×24 小时前修改的”,范围极窄,几乎不用
更精确控制分钟级时间,用 -mmin:find . -mmin -30 查找最近 30 分钟内修改的文件,不受日期切换影响。
-exec 后面的 {} 和 \; 之间必须有空格
find 对语法非常严格。-exec rm {} \; 是标准写法;写成 -exec rm {}\;(缺少空格)会导致报错:find: missing argument to '-exec'。
常见误用还有:
- 忘记转义分号:
-exec rm {} ;→ shell 会把;当作命令分隔符,提前截断find命令 - 用
+替代\;时没调整参数位置:-exec rm {} +是批量执行(推荐),但{}必须在命令末尾,不能写成rm -f {} - 跨多行写
-exec时换行符未转义,导致解析失败
搜索大目录时务必限制深度或跳过挂载点
直接 find / -name "*.conf" 可能卡住或扫到 /proc、/sys、容器 overlayfs、NFS 挂载点,轻则慢,重则权限错误或进程阻塞。
安全做法是:
- 加
-maxdepth 3限制层级(如只查/etc下两级) - 加
-mount(或-xdev)避免跨文件系统,防止误入 USB 盘、Docker volume 等 - 排除伪文件系统:
find /etc -path "/etc/alternatives" -prune -o -name "*.conf" -print - 用
-type f显式限定只查普通文件,跳过目录、设备、socket 等
真正线上排查时,find 不是越全越好,而是越准、越快、越可控越好——多数问题只需要聚焦某几个路径和类型。











