在日常开发或办公中,我们经常需要在大量文件里快速找到目标文件。
find是 Unix 系统下一个非常强大的命令行工具,但很多人用起来常常踩坑,尤其是在 macOS 下。本文就以查找 PDF 文件为例,讲解find的正确用法、常见陷阱及一些实用技巧。

一、基础用法
1.1 主要功能:查找目标文件
假设你想在当前目录及子目录下查找所有 PDF 文件:
bash
find . -name "*.pdf"
解释:
-
.表示从当前目录开始查找。 -
-name "*.pdf"表示匹配文件名以.pdf结尾的文件。 -
注意:macOS 下 必须指定路径,否则会报错:
bash
find: -name: argument expected
1.2 忽略大小写
如果文件可能是 .PDF 或 .Pdf,使用 -iname(i 表示 ignore case):
bash
find . -iname "*.pdf"
这样就能匹配 .pdf、.PDF、.Pdf 等所有变体。
1.3 只查找文件,不查找目录
有时候目录名里也可能包含 .pdf,这时可以加上 -type f 只匹配文件:
bash
find . -type f -iname "*.pdf"
-type f:只匹配普通文件-type d:只匹配目录
1.4 返回绝对路径
默认情况下,find 返回的是相对路径。如果你希望看到完整绝对路径,可以这样写:
bash
find "$(pwd)" -type f -iname "*.pdf"
$(pwd)会返回当前目录的绝对路径。- 这样查到的每个 PDF 文件都会带上完整路径,便于复制或脚本处理。
1.5 只查看当前目录下的文件
在默认情况下,find 是 递归搜索 的,它会自动进入所有子目录。如果只想查找当前目录下的文件,在 macOS/Linux 下,可以用 -maxdepth 1:
bash
find . -maxdepth 1 -type f -iname "*.pdf"
解释:
-
.:当前目录 -
-maxdepth 1:只搜索当前目录,不进入子目录 -
-type f:只匹配文件 -
-iname "*.pdf":忽略大小写匹配 PDF 文件
输出示例:
part-0_5.pdf
The-Art-of-Linear-Algebra-zh-CN (1).pdf
注意:-maxdepth 是 GNU find 支持的参数,在 macOS 上也可用 ,前提是系统自带 find(BSD find)版本较新或者用 Homebrew 安装 GNU find (gfind)。
二、 高级技巧
2.1 排序显示
如果你想按文件名排序:
bash
find . -type f -iname "*.pdf" | sort
2.2 高亮显示
结合 ls 可以高亮文件:
bash
find . -type f -iname "*.pdf" -exec ls -lh {} \;
-
-exec会对每个查到的文件执行命令,这里用ls -lh显示详细信息。 -
{}是占位符,表示"当前匹配到的文件路径"。 -
\;:表示命令结束,这里的\是转义字符,防止 shell 把;当作命令分隔符。 -
ls -lh介绍:-l是场列表模式,显示详细信息-h是human-readable,把文件大小自动转换成 KB、MB、GB,更直观
输出示例:
bash
-rw-r--r-- 1 user staff 2.3M May 21 10:30 part-0_5.pdf
-rw-r--r-- 1 user staff 1.1M May 21 11:00 The-Art-of-Linear-Algebra-zh-CN (1).pdf
| 列号 | 字段 | 说明 |
|---|---|---|
| 1 | 权限 | 文件类型及权限,如 -rw-r--r--,表示普通文件,所有者可读写,组可读,其他可读 |
| 2 | 硬链接数 | 文件硬链接的数量 |
| 3 | 所有者 | 文件所属用户 |
| 4 | 组 | 文件所属组 |
| 5 | 大小(人类可读) | 文件大小,带单位,如 KB、MB、GB |
| 6 | 最后修改时间 | 文件的最后修改日期和时间 |
| 7 | 文件名 | 文件名称,包括扩展名 |
2.3 查找多个类型
同时查找 PDF 和 Word 文档:
bash
find . -type f \( -iname "*.pdf" -o -iname "*.docx" \)
- 注意括号
\(...\),用于组合条件 -o表示"或"
2.4 去掉 ./ 或只显示文件名
默认 find 会输出带 ./ 的相对路径,如果你希望显示更干净的路径或只显示文件名:
(1) 只显示文件名
bash
find . -type f -iname "*.pdf" -exec basename {} \;
输出示例:
bash
part-0_5.pdf
The-Art-of-Linear-Algebra-zh-CN (1).pdf
(2) 去掉前面的 ./ 前缀,保留目录结构:
bash
find . -type f -iname "*.pdf" | sed 's|^\./||'
-
sed是 stream editor(流编辑器) ,用来对文本流进行查找、替换、删除等操作。在这里它的作用是:去掉每行开头的 ./ 前缀,让输出更整洁。
-
's|^\./||'是sed的替换命令,语法是:s|pattern|replacement|s→ substitute(替换)|→ 分隔符(也可以用/,但这里用|避免和路径/冲突)pattern→ 正则表达式要匹配的内容^→ 行首\.→ 字面上的点.(点在正则里是特殊字符,所以要转义)/→ 字面上的斜杠replacement→ 替换成的内容
^\./的意思是匹配行开头的./,然后替换成空字符串'',就等于删除开头的./。
输出示例:
bash
基础知识/线性代数/references/part-0_5.pdf
基础知识/线性代数/references/The-Art-of-Linear-Algebra-zh-CN (1).pdf
这两种方法可以让输出更清爽,也方便复制路径或者用于脚本处理。
三、 常见坑
3.1 路径缺失
在macOS下报错:
bash
find -name "*.pdf"
报错信息:
bashfind: illegal option -- n usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression] find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
正确写法:
bash
find . -name "*.pdf"
3.2 大小写不匹配
找不到小写pdf:
bash
find . -name "*.PDF"
使用 -iname 忽略大小写:
bash
find . -iname "*.pdf"
3.3 匹配到目录
可能包含目录名:
bash
find . -iname "*.pdf"
加 -type f 只匹配文件:
bash
find . -type f -iname "*.pdf"
四、总结
| 参数/选项 | 作用说明 | 示例命令 & 说明 |
|---|---|---|
. 或 <路径> |
指定查找的起始目录,. 表示当前目录 |
find . -name "*.pdf" → 从当前目录开始查找 PDF 文件 |
-name <pattern> |
按文件名匹配,区分大小写 | find . -name "*.txt" → 匹配所有 .txt 文件 |
-iname <pattern> |
按文件名匹配,忽略大小写 | find . -iname "*.PDF" → 匹配 .pdf / .PDF / .Pdf 等 |
-type f |
匹配普通文件 | find . -type f -iname "*.pdf" → 只匹配文件,不包括目录 |
-type d |
匹配目录 | find . -type d -name "backup" → 查找名为 backup 的目录 |
-maxdepth <n> |
设置最大递归深度(只查当前目录用 -maxdepth 1) |
find . -maxdepth 1 -type f -iname "*.pdf" → 只查当前目录 |
-exec <cmd> {} \; |
对每个匹配到的文件执行命令,{} 代表文件路径,\; 表示命令结束 |
find . -type f -iname "*.pdf" -exec ls -lh {} \; → 打印详细文件信息 |
-print |
显式输出匹配文件路径(有些复杂条件组合时需要加) | find . -type f -iname "*.pdf" -print |
-o |
"或"操作,用于组合多个条件 | find . -type f \( -iname "*.pdf" -o -iname "*.docx" \) → 查找 PDF 或 Word 文件 |
-prune |
阻止递归进入目录,用于限制搜索范围 | find . -type d -name "*" -prune -o -type f -iname "*.pdf" -print → 只查当前目录 |
-exec ... {} \;可以改成-exec ... {} +来一次性执行,提高效率-maxdepth 1和-prune都可以用来实现 只查当前目录 ,根据你 macOS 的find版本选择
find 虽然最开始看起来有点复杂,但掌握这些技巧后,你可以在终端里快速定位任何文件,甚至可以和 grep、xargs 等命令组合做更复杂的批量操作。