名称

find - 在目录层次结构中搜索文件

简介

find [路径...] [表达式]

描述

find 命令递归地搜索指定目录树中的文件,并对匹配的文件执行指定的操作。如果没有指定路径,默认为当前目录。表达式由选项、测试条件和操作组成,它们可以组合使用,以精确控制搜索范围和后续处理。

该命令主要用于:

  • 根据文件名、类型、大小、权限、时间戳等属性查找文件。

  • 对找到的文件执行命令(如删除、复制、移动)。

  • 与管道和其他命令结合,实现批量文件处理。

选项与表达式

find 的表达式通常由测试条件(返回 true 或 false)和操作(执行某些动作)构成。下面列出常用的表达式元素。在表达式中可以使用逻辑运算符组合多个条件。

表达式/选项

描述

-name 模式

按文件名匹配(区分大小写),模式可包含 shell 通配符(*, ?, []),需用引号括起。

-iname 模式

类似 -name,但忽略大小写。

-type c

按文件类型:f 普通文件、d 目录、l 符号链接、b 块设备、c 字符设备、p 管道、s 套接字。

-size n[cwbkMG]

按文件大小匹配。n 为数字,后缀:c 字节(默认)、w 双字节字、b 512字节块、k KiB、M MiB、G GiB。前缀 + 表示大于,- 表示小于。

-user 用户名

文件所有者是指定用户。

-group 组名

文件所属组是指定组。

-perm 模式

按权限匹配。模式可以是八进制数(如 644)或符号表示(如 u=rw)。可加 /- 前缀表示任意位匹配或所有位匹配。

-mtime n

按文件内容最后修改时间(以天为单位)。+n 表示 n 天前,-n 表示 n 天内。

-atime n

按文件最后访问时间(天)。

-ctime n

按文件状态最后改变时间(天)。

-newer 参考文件

文件修改时间晚于参考文件。

-maxdepth 层级

限制搜索深度,-maxdepth 1 只搜索当前目录,不进入子目录。

-mindepth 层级

从指定深度开始搜索(-mindepth 1 排除当前目录本身)。

-depth

先处理目录内容,再处理目录本身(常用于配合 -delete)。

-prune

如果文件是目录,则不再进入该目录。常与 -name 等条件结合排除某些目录。

-not!

逻辑非,取反条件的匹配结果。

-a-and

逻辑与(默认连接方式),两个条件都必须满足。

-o-or

逻辑或,任一条件满足即可。

( 表达式 )

用圆括号分组表达式,注意在 shell 中需转义或加引号。

-print

将匹配文件的完整路径打印到标准输出(默认操作)。

-ls

对匹配文件执行 ls -dils 格式的详细列表。

-exec 命令 {} \;

对每个匹配文件执行指定命令,{} 代表当前文件名,需以 \; 结束。命令只在 find 返回 0 时执行。

-exec 命令 {} +

将多个匹配文件作为参数一次传递给命令(提高效率),但命令参数长度受系统限制。

-ok 命令 {} \;

类似 -exec,但在执行前会提示用户确认。

-delete

删除匹配的文件或目录(删除目录需为空)。隐含 -depth 选项。

-printf 格式

按指定格式打印文件信息(参见 man 手册获取格式说明)。

-quit

找到第一个匹配后立即退出。

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

退出状态

  • 0 – 所有路径都成功处理,且没有遇到错误。

  • >0 – 发生错误(例如某个路径不存在、权限不足、表达式语法错误等)。

常用示例

1. 按文件名查找

find /home -name "*.txt"

/home 下查找所有以 .txt 结尾的文件。

2. 忽略大小写查找

find . -iname "readme*"

当前目录下查找以 readme 开头的文件(不区分大小写)。

3. 按文件类型查找

find /var/log -type f -name "*.log"

/var/log 下查找普通文件且扩展名为 .log 的文件。

4. 按文件大小查找

find . -size +10M -size -100M

查找大小大于 10 MiB 且小于 100 MiB 的文件。

5. 按时间查找

find . -mtime -7

查找最近 7 天内修改过的文件。

6. 组合条件(逻辑与)

find . -type f -name "*.sh" -perm /u=x

查找当前目录下所有用户可执行的 shell 脚本。

7. 逻辑或和括号

find . \( -name "*.c" -o -name "*.h" \) -type f

查找所有 .c.h 的普通文件(注意转义括号)。

8. 排除某个目录

find . -path "./cache" -prune -o -name "*.tmp" -print

排除 ./cache 目录,查找其他位置的所有 .tmp 文件。

9. 对找到的文件执行命令

find . -name "*.bak" -exec rm {} \;

删除所有 .bak 备份文件(使用 -delete 更安全高效)。

10. 使用 -exec+ 变体

find . -type f -name "*.log" -exec chmod 644 {} +

将所有 .log 文件的权限一次性修改为 644

11. 交互式删除(需要确认)

find . -name "*.tmp" -ok rm {} \;

删除每个 .tmp 文件前询问用户。

12. 查找并显示详细信息

find /usr/bin -type f -size -1M -ls

/usr/bin 下查找小于 1 MiB 的文件,并显示类似 ls -l 的详细信息。

13. 限制搜索深度

find . -maxdepth 2 -name "config"

仅搜索当前目录及其直接子目录中的 config 文件。

14. 查找空文件或空目录

find . -empty

15. 根据权限查找

find /home -type f -perm 644

查找权限为 644 的普通文件。

注意事项

  • 使用通配符时,务必用引号括起模式(如 "*.txt"),防止 shell 提前展开。

  • -exec 中的 {} 会被替换为当前文件名,分号 ; 需要转义为 \; 或用 ';' 括起,以避免被 shell 解释。

  • 当使用 -delete 时,系统会隐含 -depth 选项,确保先删除子文件再删除目录。务必谨慎,避免误删。

  • 逻辑运算符优先级:!(非)最高,其次为 -a(默认连接),最低为 -o(或)。使用括号可以改变优先级,但需注意在 shell 中括号必须转义(\( ... \))或加引号。

  • 在编写复杂的查找命令前,建议先用 -print 测试,确认匹配结果正确后再执行实际操作。

  • 处理大量文件时,-exec ... +-exec ... \; 效率更高,因为它减少了命令调用的次数。

  • find 默认不会跟随符号链接,如果需要跟随,可以使用 -L 选项。

相关命令

  • locate – 基于数据库快速查找文件名(通常不实时更新)。

  • grep – 在文件内容中搜索模式。

  • xargs – 从标准输入构建并执行命令行,常与 find 配合使用(如 find ... | xargs command)。

  • which – 查找可执行文件的位置(基于 PATH)。

  • whereis – 查找二进制、源代码和手册页文件。

  • stat – 显示文件或文件系统的详细状态信息。

  • test – 检查文件类型和比较值,可在 shell 脚本中用于文件判断。