find
在目录树中递归搜索文件,支持按名称、类型、权限、时间、大小等条件过滤,并可对结果执行操作。
基本语法
bash
find [路径] [条件] [动作]
# 默认路径为当前目录 .按名称搜索
bash
# 精确匹配文件名
find / -name "passwd"
# 通配符匹配(注意引号)
find /etc -name "*.conf"
# 忽略大小写
find /home -iname "readme*"
# 排除特定名称
find . -not -name "*.log"
find . ! -name "*.log"按类型搜索
| 类型 | 说明 |
|---|---|
f | 普通文件 |
d | 目录 |
l | 符号链接 |
b | 块设备 |
c | 字符设备 |
p | 管道 |
s | socket |
bash
# 只找目录
find /var -type d -name "log*"
# 只找普通文件
find . -type f -name "*.sh"
# 只找符号链接
find /usr/bin -type l按时间搜索
时间单位默认为天(-mtime),加 min 后缀为分钟(-mmin)。
| 参数 | 含义 |
|---|---|
-mtime n | 内容修改时间恰好 n 天前 |
-mtime -n | n 天内修改 |
-mtime +n | n 天前修改 |
-atime | 访问时间 |
-ctime | 状态变更时间(权限/所有者等) |
bash
# 7天内修改的文件
find /var/log -type f -mtime -7
# 30天前修改的文件
find /tmp -mtime +30
# 60分钟内修改
find . -mmin -60按大小搜索
单位:c(字节)、k(KB)、M(MB)、G(GB)
bash
# 大于 100M 的文件
find / -type f -size +100M
# 小于 1K 的文件
find . -type f -size -1k
# 恰好 512字节
find . -size 512c按权限搜索
bash
# 权限恰好为 755
find /usr -perm 755
# 包含 setuid 位
find / -perm /4000
# 包含 setgid 位
find / -perm /2000
# 可写文件(任意人可写)
find /tmp -perm /o+w按所有者搜索
bash
# 属于 root 的文件
find / -user root -type f
# 属于 www-data 组
find /var/www -group www-data
# 无主文件(uid 不存在)
find / -nouser
# 无属组文件
find / -nogroup逻辑组合
bash
# AND(默认,两个条件同时满足)
find . -type f -name "*.log" -size +10M
# OR
find . -name "*.jpg" -o -name "*.png"
# NOT
find . ! -name "*.bak"
# 分组(使用括号,需转义)
find . \( -name "*.log" -o -name "*.tmp" \) -mtime +7路径控制
bash
# 限制搜索深度
find . -maxdepth 2 -name "*.conf"
find . -mindepth 1 -maxdepth 3 -type f
# 排除某个目录(-prune)
find / -path /proc -prune -o -name "*.conf" -print对结果执行操作
-print / -print0
bash
# 默认打印(-print 可省略)
find . -name "*.sh" -print
# 输出以 NUL 分隔(配合 xargs -0 处理含空格的文件名)
find . -name "*.log" -print0 | xargs -0 rm-exec
bash
# 对每个结果执行命令({} 代表当前文件,\; 结束)
find . -name "*.bak" -exec rm -f {} \;
# 批量执行(效率更高,类似 xargs)
find . -name "*.sh" -exec chmod +x {} +
# 删除30天前的日志
find /var/log -name "*.log" -mtime +30 -exec rm {} \;-delete
bash
# 直接删除(比 -exec rm 更安全高效)
find /tmp -name "*.tmp" -mtime +1 -delete配合 xargs
bash
# 找到所有 .c 文件并统计行数
find . -name "*.c" | xargs wc -l
# 含空格文件名时使用 -print0 + xargs -0
find . -name "* *" -print0 | xargs -0 ls -lh实用示例
bash
# 找出最大的10个文件
find / -type f -printf "%s\t%p\n" 2>/dev/null | sort -rn | head -10
# 找出空文件
find . -type f -empty
# 找出空目录
find . -type d -empty
# 递归修改目录权限(目录755,文件644)
find /var/www -type d -exec chmod 755 {} +
find /var/www -type f -exec chmod 644 {} +
# 查找并压缩30天前的日志
find /var/log -name "*.log" -mtime +30 -exec gzip {} \;
# 查找含特定字符串的文件
find . -type f -name "*.py" -exec grep -l "import os" {} +