010 find命令

命令说明

find 用于在目录树中按名称、类型、时间、大小、权限等条件查找文件,并可对结果直接执行命令(-exec),是 Linux 最强大的文件检索工具。

语法

find [查找路径] [查找条件] [动作]

常用参数

参数说明
-name "pattern"按文件名匹配(支持通配符),如 -name "*.log"
-iname按名称匹配且忽略大小写
-type f/d/l按类型:f 普通文件、d 目录、l 符号链接
-size +10M / -500k按大小:+ 大于、- 小于、无符号等于;单位 c/k/M/G
-mtime -7按修改时间:-7 表示 7 天内,+7 表示 7 天前(单位:天)
-mmin -60按分钟级修改时间
-user name按文件所有者
-perm 755按权限查找
-maxdepth n限制查找深度,n=1 只查当前层
-exec cmd {} \;对每个结果执行命令,{} 代表文件名
-delete删除找到的文件(GNU find)

使用示例

$ find /etc -name "nginx.conf"

在 /etc 下按名称查找 nginx.conf

$ find . -name "*.log" -type f

查找当前目录下所有 .log 文件

$ find /var/log -mtime +30 -name "*.gz"

查找 30 天前的压缩日志(清理旧日志常用)

$ find / -size +100M -type f

查找根分区下大于 100M 的文件,排查磁盘占用

$ find . -name "*.sh" -exec chmod +x {} \;

给所有 shell 脚本加执行权限

$ find /tmp -type f -atime +7 -delete

删除 /tmp 下 7 天未访问的文件

$ find . -type d -empty

查找空目录

$ find /data -name "core.*" | xargs rm -f

配合 xargs 批量删除 core 文件

$ find . -user www -name "*.php" | wc -l

统计某用户的 php 文件数量

实用技巧

  • find 会遍历整个目录树,范围越大越慢;尽量缩小查找路径并用 -maxdepth 限制深度。
  • -name 要加引号:find . -name *.txt 会先被 shell 展开导致查找错误,应写 "*.txt"。
  • -exec 与 xargs 对比:-exec 每个文件 fork 一次进程,文件多时 find ... | xargs 更高效。
  • 按名字快速查找用 locate(基于数据库,需 updatedb),按属性精确查找用 find。
  • find 表达式支持逻辑:-a(与)、-o(或)、!(非),如 find . \( -name "*.c" -o -name "*.h" \)。