结论:用 find 查文件需明确“从哪找、找什么、怎么筛”,按需组合参数而非死记硬背;区分-name与-iname、理解-mtime时间范围、-prune需配合-o和括号、-size单位是1024²字节、操作前必先-print验证。

直接说结论:用 find 查文件,核心是搞清「从哪找」「找什么」「怎么筛」——不是背命令,而是按需组合参数,否则容易漏结果或卡死。
按文件名查找最常用但容易忽略大小写
默认 find 区分大小写,find /home -name "config.json" 找不到 Config.JSON。真要模糊匹配,得换 -iname:find /home -iname "config.*"。注意通配符必须加引号,否则 shell 会提前展开,导致查不到预期文件。
-
-name:严格匹配,区分大小写 -
-iname:忽略大小写,适合快速定位配置文件、日志等 - 路径末尾不加
/(如/var/log不要写成/var/log/),否则某些系统可能报Permission denied却不提示原因
按修改时间筛选时,-mtime 的数字含义反直觉
-mtime 1 不代表“1 天前”,而是“恰好 24 小时前到 48 小时前之间”,即“距现在 1×24h ~ 2×24h 内修改过的文件”。要找“最近 24 小时内改过的”,得用 -mmin -60(分钟级)或 -newermt "2024-05-20"(指定日期)。
-
-mtime n:n 是整数,范围是 [n×24h, (n+1)×24h) -
-mmin -30:30 分钟内修改的(负号表示“小于”) -
-newermt "2024-05-20 14:00":比指定时间更新,支持完整时间戳,最准
查大文件或排除目录时,-size 和 -prune 必须配合 -depth 或位置逻辑
find /var -size +100M 看似简单,但若 /var/log 下有滚动日志且权限受限,find 可能卡在子目录报错并中断后续扫描。更稳的做法是先跳过不想进的目录:find /var \( -path "/var/log" -o -path "/var/cache" \) -prune -o -size +100M -print。这里 -prune 必须紧跟在路径条件后,且整个排除逻辑要用 \( ... \) 括起来,否则优先级错乱,-prune 不生效。
-
-size +100M:单位 M 是 1024×1024 字节,不是 MB;+ 表示“大于”,- 表示“小于” -
-prune不是独立动作,它只对当前路径生效,必须和-o(或)连用才跳过子树 - 如果目标目录很深、文件极多,加
-maxdepth 2限制层级,避免遍历整个/
执行删除或重命名前,务必先用 -print 或 -ls 验证结果集
find /tmp -name "*.tmp" -delete 一气呵成很爽,但一旦路径写错或通配符误匹配,删掉的是真实数据。安全做法永远分两步:find /tmp -name "*.tmp" -print 看输出是否符合预期;确认无误后再把 -print 换成 -delete 或 -exec rm {} \;。注意 -exec 后花括号 {} 和分号 \; 缺一不可,少一个就语法错误。
-
-print最轻量,只输出路径;-ls还带权限、大小、时间,适合排查误匹配 -
-delete比-exec rm {} \;快,但不支持复杂逻辑(比如只删空文件) - 批量重命名建议用
-exec rename 's/old/new/' {} +,+比\;更高效(合并调用)
真正难的不是记住所有参数,而是理解每个选项的生效时机和作用域——find 的表达式是短路求值的,顺序错了,-prune 就变摆设,-mtime 就算错时间窗口,-delete 就删错地方。










