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

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

在这里插入图片描述

一、基础用法

1.1 主要功能:查找目标文件

​ 假设你想在当前目录及子目录下查找所有 PDF 文件:

find . -name "*.pdf"

​ 解释:

  • . 表示从当前目录开始查找。

  • -name "*.pdf" 表示匹配文件名以 .pdf 结尾的文件。

  • 注意:macOS 下 必须指定路径,否则会报错:

find: -name: argument expected

1.2 忽略大小写

​ 如果文件可能是 .PDF.Pdf,使用 -iname(i 表示 ignore case):

find . -iname "*.pdf"

​ 这样就能匹配 .pdf.PDF.Pdf 等所有变体。

1.3 只查找文件,不查找目录

​ 有时候目录名里也可能包含 .pdf,这时可以加上 -type f 只匹配文件:

find . -type f -iname "*.pdf"
  • -type f:只匹配普通文件
  • -type d:只匹配目录

1.4 返回绝对路径

​ 默认情况下,find 返回的是相对路径。如果你希望看到完整绝对路径,可以这样写:

find "$(pwd)" -type f -iname "*.pdf"
  • $(pwd) 会返回当前目录的绝对路径。
  • 这样查到的每个 PDF 文件都会带上完整路径,便于复制或脚本处理。

1.5 只查看当前目录下的文件

​ 在默认情况下,find递归搜索的,它会自动进入所有子目录。如果只想查找当前目录下的文件,在 macOS/Linux 下,可以用 -maxdepth 1

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 排序显示

​ 如果你想按文件名排序:

find . -type f -iname "*.pdf" | sort

2.2 高亮显示

​ 结合 ls 可以高亮文件:

find . -type f -iname "*.pdf" -exec ls -lh {} \;
  • -exec 会对每个查到的文件执行命令,这里用 ls -lh 显示详细信息。

  • {}是占位符,表示“当前匹配到的文件路径”。

  • \;:表示命令结束,这里的 \ 是转义字符,防止 shell 把 ; 当作命令分隔符。

  • ls -lh介绍:

    • -l是场列表模式,显示详细信息
    • -h是human-readable,把文件大小自动转换成 KB、MB、GB,更直观

    输出示例:

-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 文档:

find . -type f \( -iname "*.pdf" -o -iname "*.docx" \)
  • 注意括号 \(...\),用于组合条件
  • -o 表示“或”

2.4 去掉 ./ 或只显示文件名

​ 默认 find 会输出带 ./ 的相对路径,如果你希望显示更干净的路径或只显示文件名:

(1) 只显示文件名
find . -type f -iname "*.pdf" -exec basename {} \;

输出示例:

part-0_5.pdf
The-Art-of-Linear-Algebra-zh-CN (1).pdf
(2) 去掉前面的 ./ 前缀,保留目录结构
find . -type f -iname "*.pdf" | sed 's|^\./||'
  • sedstream editor(流编辑器),用来对文本流进行查找、替换、删除等操作

    在这里它的作用是:去掉每行开头的 ./ 前缀,让输出更整洁。

  • 's|^\./||'sed 的替换命令,语法是:

    s|pattern|replacement|
    
    • s → substitute(替换)
    • | → 分隔符(也可以用 /,但这里用 | 避免和路径 / 冲突)
    • pattern → 正则表达式要匹配的内容
    • ^ → 行首
    • \. → 字面上的点 .(点在正则里是特殊字符,所以要转义)
    • / → 字面上的斜杠
    • replacement → 替换成的内容

    ^\./ 的意思是匹配行开头的 ./,然后替换成空字符串 '',就等于删除开头的 ./

​ 输出示例:

基础知识/线性代数/references/part-0_5.pdf
基础知识/线性代数/references/The-Art-of-Linear-Algebra-zh-CN (1).pdf

​ 这两种方法可以让输出更清爽,也方便复制路径或者用于脚本处理。

三、 常见坑

3.1 路径缺失

​ 在macOS下报错:

find -name "*.pdf"

报错信息:

find: illegal option -- n
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

​ 正确写法:

find . -name "*.pdf"

3.2 大小写不匹配

​ 找不到小写pdf:

find . -name "*.PDF"

​ 使用 -iname 忽略大小写:

find . -iname "*.pdf"

3.3 匹配到目录

​ 可能包含目录名:

find . -iname "*.pdf"

​ 加 -type f 只匹配文件:

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 1find . -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 等命令组合做更复杂的批量操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未收敛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值