名称
find - 在目录层次结构中搜索文件
简介
find [路径...] [表达式]描述
find 命令递归地搜索指定目录树中的文件,并对匹配的文件执行指定的操作。如果没有指定路径,默认为当前目录。表达式由选项、测试条件和操作组成,它们可以组合使用,以精确控制搜索范围和后续处理。
该命令主要用于:
根据文件名、类型、大小、权限、时间戳等属性查找文件。
对找到的文件执行命令(如删除、复制、移动)。
与管道和其他命令结合,实现批量文件处理。
选项与表达式
find 的表达式通常由测试条件(返回 true 或 false)和操作(执行某些动作)构成。下面列出常用的表达式元素。在表达式中可以使用逻辑运算符组合多个条件。
退出状态
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 . -empty15. 根据权限查找
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 脚本中用于文件判断。