按名称匹配是什么
find 的 -name 匹配的是文件名的最后一段,也就是 basename;想匹配完整路径要用 -path。-iname 在比较时忽略大小写。两者都接受通配符,模式必须加引号,否则会被 shell 提前展开——那时 find 收到的模式就取决于当前目录里恰好有哪些文件。
基本信息
| 适用平台 | Linux、Unix 通用;自定义输出等属于 GNU find 扩展 |
|---|---|
| 命令语法 | find 路径 [附加条件] -name '模式' |
| 匹配对象 | -name 与 -iname 匹配文件名最后一段;-path 匹配完整路径 |
| 通配符 | 星号、问号与方括号,必须用引号包住 |
典型使用场景
- 按扩展名找文件:批量处理某类配置或数据文件
- 命名风格不统一时忽略大小写查找
- 组合条件:目录名含某关键字且文件名匹配某模式
- 排除指定文件:用取反条件把不需要的剔除
- 与执行动作组合,找到后统一处理
常用示例
常用示例
find /var/www -name '*.php'
find . -iname 'readme*'
find /data -path '*conf*' -name '*.yml'
find /etc -name '*.conf' -not -name '*.d/*'
find . -maxdepth 2 -name '*.log' -size +100M条件对照
| 条件 | 匹配对象 | 说明 |
|---|---|---|
| -name | 文件名最后一段 | 区分大小写 |
| -iname | 文件名最后一段 | 忽略大小写 |
| -path | 完整路径字符串 | 用来限定所在目录 |
| 取反条件 | 对条件取反 | 用于排除 |
| -maxdepth | 限制递归层数 | 与目录结构配合使用 |
| -regex | 整个路径的正则 | 方言差异大,日常少用 |
模式一定要加引号:不加时 shell 会先按当前目录展开一次,find 收到的模式就取决于目录里恰好有哪些文件,结果无法复现。
想匹配路径用 -path,写成 -name 再带斜杠永远匹配不上;两者可以叠加,用来做「目录含关键字且文件名符合模式」的组合过滤。
限制搜索深度能明显提速:只关心当前目录下的文件时用 -maxdepth 1,避免无谓地递归整棵目录树,尤其是文件数量很大的目录。
限定搜索范围
| 选项 | 作用 | 注意 |
|---|---|---|
| -maxdepth N | 限制向下搜索层数 | 全局选项,位置有要求 |
| -mindepth N | 跳过前 N 层 | 只处理固定层级时有用 |
| -type f | 只匹配普通文件 | 避免目录混入结果 |
| -print0 | 以空字符分隔输出 | 配合 xargs -0 处理怪文件名 |
| -iname | 忽略大小写匹配 | 折叠规则受 locale 影响 |
-name 的模式只匹配路径的最后一段,不跨越路径分隔符,所以 -name 'a/b' 永远不会命中,涉及中间目录要用 -path。忽略大小写用 -iname,但它的折叠规则随语言环境变化,同一台机器换个 LANG 就可能匹配到不同结果。