【find的用法】macOS/Linux 下高效查找文件

在日常开发或办公中,我们经常需要在大量文件里快速找到目标文件。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|^\./||'
  • sedstream 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"

报错信息:

bash 复制代码
find: 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 虽然最开始看起来有点复杂,但掌握这些技巧后,你可以在终端里快速定位任何文件,甚至可以和 grepxargs 等命令组合做更复杂的批量操作。

相关推荐
逆境不可逃1 小时前
Hello-Agents 第二部分-第九章总结:上下文工程
linux·运维·服务器
spencer_tseng1 小时前
HeapOOM && jvisualvm.exe
java·linux·jvisualvm.exe
小此方1 小时前
Re:Linux系统篇(十九)进程篇·四:内核托底与生死交错 ,深度硬核剖析“僵尸”与“孤儿”进程
linux·运维·驱动开发
wj30558537810 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
abigriver10 小时前
打造 Linux 离线大模型级语音输入法:Whisper.cpp + 3090 显卡加速与 Rime 中英混输终极调优指南
linux·运维·whisper
wangqiaowq10 小时前
windows下nginx的安装
linux·服务器·前端
YYRAN_ZZU11 小时前
Petalinux新建自动脚本启动
linux
charlie11451419111 小时前
嵌入式Linux驱动开发pinctrl篇(1)——从寄存器到子系统:驱动演进之路
linux·运维·驱动开发
于小猿Sup12 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶