Skip to content

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管道
ssocket
bash
# 只找目录
find /var -type d -name "log*"

# 只找普通文件
find . -type f -name "*.sh"

# 只找符号链接
find /usr/bin -type l

按时间搜索 ​

时间单位默认为天(-mtime),加 min 后缀为分钟(-mmin)。

参数含义
-mtime n内容修改时间恰好 n 天前
-mtime -nn 天内修改
-mtime +nn 天前修改
-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

对结果执行操作 ​

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" {} +