Linux 文件查找命令 locate 与 find 完全指南

忘了配置文件放在哪、要按权限或大小批量筛文件、要清掉 30 天前的日志------这类活都归 locatefind。本文按「先选工具 → 再学匹配条件 → 最后批量处理」三步走:locate 查数据库秒出结果,find 实时遍历、支持十几类条件与动作,文末再用四条实战把它们串起来。文中命令名均标注英文全称(如 locate = list files in databases that match a pattern),完整清单见文末《附:命令英文全称速查表》。

一、locate 与 find 怎么选

两条路线的差别只有一句话:locate 读数据库、快但对新文件不敏感;find 实时扫盘、慢但结果永远准。

对比项 locate find
数据来源 mlocate 数据库(updatedb 生成的快照) 实时遍历目录树
速度 毫秒级,与文件总量基本无关 与目录规模成正比,慢
时效性 只认上次 updatedb 时存在的文件,新建的查不到 永远反映磁盘当前状态
匹配维度 只能按名称 / 路径 名称、类型、属主、权限、大小、时间、inode 等十几类
权限可见性 只列出用户有权读取的目录树 需要对目录同时有读(r)与执行(x)权限
能否顺手处理文件 不能,只输出文件名 能,-exec / -delete 直接干活

结论:知道大概名字、只要快 → locate;要按条件筛、或要顺手处理 → find

二、locate:查数据库的秒查工具

2.1 locate 用法速查表

写法 作用 说明(英文原意)
locate passwd 查名字含 passwd 的文件 纯字符串时匹配路径任意位置
locate -b passwd 只匹配最后一段文件名 b asename:/etc/passwd 算,/etc/passwd.d/x 不算
locate -i PASSWD 忽略大小写 ignore-case,同时作用于模式和文件名
locate -c passwd 只输出匹配条数 count
locate -l 5 passwd 最多输出 5 条 limit
locate -r 'http.*conf' 用正则匹配 r egular expression,匹配的是完整路径
locate -d /tmp/x.db passwd 换一个数据库文件 d atabase,也可用环境变量 LOCATE_PATH
locate -e passwd 只输出当前真实存在的 existing:库里记过、磁盘上已删的不输出
locate -w passwd 匹配完整路径(默认行为) wholename
locate -S 只看数据库统计信息 Statistics:条目数、库文件大小

记忆点locate foo 是「路径任意位置含 foo」;一旦模式里带了 * ? [],就变成「整条路径 必须匹配这个模式」,所以带通配符时前后都要补 *,写成 locate '*foo*'

2.2 最简演示

bash 复制代码
# locate 由 mlocate 提供,先装它,再装个软件试试------查不到
[root@zhb-m1 ~]# yum install -y mlocate
[root@zhb-m1 ~]# yum install -y httpd
[root@zhb-m1 ~]# locate httpd.conf
(无输出)

# 刷新数据库再查
[root@zhb-m1 ~]# updatedb
[root@zhb-m1 ~]# locate httpd.conf
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf

# 大小写:先造一个全大写的文件
[root@zhb-m1 ~]# touch /etc/PASSWD
[root@zhb-m1 ~]# locate PASSWD           # 默认区分大小写,只认全大写那个
/etc/PASSWD
[root@zhb-m1 ~]# locate -i -c PASSWD     # 忽略大小写后统计条数
34

# 正则匹配
[root@zhb-m1 ~]# locate -r 'http.*conf'
/etc/httpd/conf/httpd.conf
/usr/lib/tmpfiles.d/httpd.conf

# -b 的对照:basename 取最后一段,dirname 取前面部分
[root@zhb-m1 ~]# basename /usr/share/doc
doc
[root@zhb-m1 ~]# dirname /usr/share/doc
/usr/share

⚠️ 注意locate 查的是数据库快照 ,不是磁盘现状------刚建的文件、刚编译出来的程序一概查不到,必须先 updatedb

2.3 updatedb:刷新数据库

updatedb 由 cron 每天自动跑一次;手工执行要 root,全盘重建通常几十秒。

写法 作用 说明(英文原意)
updatedb /etc/updatedb.conf 全量重建 默认库文件 /var/lib/mlocate/mlocate.db
updatedb -v 边扫边打印路径 verbose
updatedb -U /home 只扫指定子树 U:database-root
updatedb -o /tmp/x.db 写到别的库文件 o utput,配 locate -d
updatedb -l 0 关闭可见性标记 l owercase:0/no 时任何人都能查到别人的文件
updatedb -e '/tmp /mnt' 追加排除目录(仅本次) e:add-prunepaths
updatedb -f nfs 追加排除的文件系统 f:add-prunefs

记忆点updatedb -l 1(默认)会在库里给每条记录带「可见性」标记,locate 报结果前先查父目录权限,所以普通用户看不到别人的私有文件;改成 -l 0 就没有这层保护了。

三、find:实时遍历的万能筛子

3.1 find 语法与表达式总览

bash 复制代码
find [path] [expression] [action]
  • path:查询路径,不写就是当前目录及其子目录。
  • expression:查询条件,可由多个表达式组合。
  • action :找到文件后做什么,不写默认 -print
想按什么筛 用哪个表达式
名称 -name / -iname
类型 -type fdlbcps
属主与属组 -user / -uid / -group / -gid / -nouser / -nogroup
权限 -perm mode / -perm -mode / -perm /mode
大小 -size +10M / -size -1k
时间 -amin -atime -cmin -ctime -mmin -mtime -newer
硬链接数与 inode -links / -inum
逻辑组合 -a(与,可省略) / -o(或) / !(非)
找到后处理 -print / -ls / -delete / -exec

⚠️ 注意!{}; 这三个符号会被 shell 先解释掉,必须转义或加引号------写 \!\{\}\;,或把整个表达式用单引号包起来。

3.2 按名称匹配:-name / -iname

写法 作用 说明(英文原意)
-name passwd 精确匹配文件名 只比对最后一段 名字,模式里不能带 /
-name '*passwd*' 模糊匹配 通配符 * ? [] 必须加引号防 shell 展开
-iname passwd 忽略大小写 insensitive name
bash 复制代码
[root@zhb-m1 ~]# touch /etc/PASSWD
[root@zhb-m1 ~]# find /etc/ -name passwd
/etc/pam.d/passwd
/etc/passwd
[root@zhb-m1 ~]# find /etc/ -name '*passwd*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/passwd
/etc/passwd-
[root@zhb-m1 ~]# find /etc/ -iname passwd
/etc/pam.d/passwd
/etc/passwd
/etc/PASSWD

3.3 按类型匹配:-type

写法 作用 说明(英文原意)
-type f 普通文件 file
-type d 目录 directory
-type l 符号链接 link
-type b / c 块设备 / 字符设备 b lock、character
-type p / s 命名管道 / 套接字 p ipe(FIFO)、socket
-type f,d 一次匹配多种类型 GNU 扩展,用逗号分隔
bash 复制代码
# 先造一个同名目录,再只筛目录
[root@zhb-m1 ~]# mkdir /etc/yum.repos.d/passwd
[root@zhb-m1 ~]# find /etc/ -name 'passwd' -type d
/etc/yum.repos.d/passwd
[root@zhb-m1 ~]# rmdir /etc/yum.repos.d/passwd

3.4 按属主匹配:-user / -group

写法 作用 说明(英文原意)
-user zhb 属于某用户的文件 也可写数字 UID
-uid 1000 按数字 UID 匹配 同样支持 +n / -n
-group wheel 属于某组的文件 也可写数字 GID
-gid 10 按数字 GID 匹配 ---
-nouser 属主已不存在 用户被删、文件残留
-nogroup 属组已不存在 组被删、文件残留
bash 复制代码
[root@zhb-m1 ~]# id zhb
uid=1000(zhb) gid=1000(zhb) 组=1000(zhb)
[root@zhb-m1 ~]# find / -user zhb
[root@zhb-m1 ~]# find / -uid 1000

[root@zhb-m1 ~]# grep wheel /etc/group
wheel:x:10:
[root@zhb-m1 ~]# find / -group wheel
[root@zhb-m1 ~]# find / -gid 10

# 无主 / 无组的残留文件
[root@zhb-m1 ~]# find / -nouser -o -nogroup

3.5 按权限匹配:-perm

同样是 -perm,加不加前缀、前缀是 - 还是 /,语义完全不同------这是最容易写错的一处。

写法 匹配规则 说明
-perm 764 权限恰好等于 764 差一位都不算
-perm -764 ugo 每一位都至少满足 777、764 都命中,760 不命中(other 不足 4)
-perm /764 ugo 任意一位满足即可 只要 owner 有 7,或 group 有 6,或 other 有 4 就命中

⚠️ 注意-perm不能加空格 、前缀必须紧贴数字。写 -perm - 764 会被 shell 拆成两个参数,find 直接报语法错误。

bash 复制代码
# 准备三个文件
[root@zhb-m1 ~]# mkdir lab && cd lab
[root@zhb-m1 lab]# touch file-{1..3}

# 精确匹配:只有 764 那个命中
[root@zhb-m1 lab]# chmod 764 file-1
[root@zhb-m1 lab]# find -perm 764
./file-1

# 全部包含:777 / 764 命中,760 不命中
[root@zhb-m1 lab]# chmod 777 file-1
[root@zhb-m1 lab]# chmod 764 file-2
[root@zhb-m1 lab]# chmod 760 file-3
[root@zhb-m1 lab]# find . -perm -764
./file-1
./file-2

# 任意满足:file-2(group 有 rwx)、file-3(other 有 r)命中
[root@zhb-m1 lab]# chmod a=- file-1
[root@zhb-m1 lab]# chmod uo=-,g=rwx file-2
[root@zhb-m1 lab]# chmod ug=-,o=r file-3
[root@zhb-m1 lab]# find -name 'file-*' -perm /764
./file-2
./file-3

特殊权限靠同一位区间的数字来找,0 在模式里表示「这一位不关心」:

bash 复制代码
# 有 suid 的文件(4000)
[root@zhb-m1 ~]# find / -perm -4000
# 同时有 suid 和 sgid(6000)
[root@zhb-m1 ~]# find / -perm -6000 2>/dev/null
-rwsr-sr-x. 1 abrt abrt 15344 Oct  2  2020 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
# 三个特殊权限里任意一个有
[root@zhb-m1 ~]# find / -perm /7000

3.6 按大小匹配:-size

单位:c 字节、k KiB、M MiB、G GiB(另有 b = 512 字节块、w = 双字节)。

写法 作用 说明
-size 10M 恰好 10M 受取整影响,见下方注意
-size +10G 大于 10G + = 大于
-size -10k 小于 10k - = 小于
-size 0 空文件 长度恰好为 0
-size 1024k 精确 1 MiB 避开取整陷阱的写法
bash 复制代码
[root@zhb-m1 ~]# find -size +10G
[root@zhb-m1 ~]# find -size -10k
[root@zhb-m1 ~]# find -size 0

⚠️ 注意find 的 size 一律向上取整到下一个单位 ,所以 -size 1M 会把 0 字节到 1 MiB 的文件全算进来。要精确 1 MiB 就写 -size 1024k;要「小于 1 MiB」必须写 -size -1048576c,写 -size -1M 只会匹配空文件。

3.7 按时间匹配:-amin / -mtime / -newer

min 结尾的以分钟 为单位,time 结尾的以24 小时为单位;前缀含义见下表。

写法 作用 说明
-amin 10 恰好 10 分钟前访问 access
-amin +10 10 分钟以前(更早) +n = 大于 n
-amin -10 10 分钟以内(更近) -n = 小于 n
-mmin 30 30 分钟内改过内容 modify
-mtime +7 7 天前及更早改过 常用于清理旧日志
-ctime -1 24 小时内状态变化过 change:权限、属主等元数据
-newer /etc/passwd 比参照文件更新 时间戳相等不算
bash 复制代码
[root@zhb-m1 ~]# find -amin 10      # 恰好 10 分钟前访问过
[root@zhb-m1 ~]# find -amin +10     # 10 分钟以前(更早)
[root@zhb-m1 ~]# find -amin -10     # 10 分钟以内(更近)
[root@zhb-m1 ~]# find -mmin -30
[root@zhb-m1 ~]# find /var/log -name '*.log' -mtime +7
[root@zhb-m1 ~]# find /etc -newer /etc/passwd

⚠️ 注意 :时间参数的正负方向 别记反------+n 是「比 n 更早(更久以前)」,-n 是「n 以内(更近)」。不少中文教程把 -mtime -7 写成「7 天以前」,正好说反了;它其实表示最近 7 天内改过的文件。

写法 作用 说明
-links 3 硬链接数恰好为 3 同样支持 +3 / -3
-inum 67160130 按 inode 号匹配 找同一文件的所有硬链接最直接
bash 复制代码
[root@zhb-m1 ~]# find -links +3
# 先看某个文件的 inode,再反查它还有几个名字
[root@zhb-m1 ~]# ls -i /etc/fstab
67160130 /etc/fstab
[root@zhb-m1 ~]# find / -inum 67160130
/etc/fstab

3.9 多条件组合:-a / -o / !

写法 含义 说明(英文原意)
expr1 expr2 两个条件并列 等价于 -a,即 and
expr1 -a expr2 逻辑与 and,默认连接词
expr1 -o expr2 逻辑或 or
! expr 逻辑非 取反,需转义成 \! 防 shell 展开
bash 复制代码
# 与:名字像 file-* 且满足 /764 权限
[root@zhb-m1 lab]# find . -name 'file-*' -perm /764

# 或:无主或无组
[root@zhb-m1 ~]# find / -nouser -o -nogroup

# 等价换算:/7000 拆开就是三个 -perm 的或
[root@zhb-m1 ~]# find / -perm -4000 -o -perm -2000 -o -perm -1000

# 非:排除小于 200M 的(注意转义感叹号)
[root@zhb-m1 ~]# find / ! -size -200M 2>/dev/null
/proc/kcore
[root@zhb-m1 ~]# ls -lh /proc/kcore
-r--------. 1 root root 128T Dec 24 22:00 /proc/kcore

记忆点-a 的优先级高于 -ofind . -name afile -o -name bfile -print 实际被解析成 find . -name afile -o \( -name bfile -a -print \),afile 永远不会打印。多条件混用 -o 时一律加括号:find . \( -name a -o -name b \) -print

3.10 找到之后做什么:action

写法 作用 说明(英文原意)
-print 输出路径(默认动作) 不写 action 时自动执行
-print0 \0 分隔输出 文件名可能含换行时配 xargs -0
-ls ls -dils 格式列出 l ist
-delete 删除找到的文件 会自动打开 -depth;只能删空目录
-exec cmd \; 对每个文件执行一次命令 {} 代表文件名,\; 表示命令结束
-exec cmd {} + 把文件批量拼成一条命令 调用次数大幅减少,只能有一个 {} 且必须在末尾
bash 复制代码
# -ls:直接看 inode、权限、大小
[root@zhb-m1 ~]# find /etc/ -name passwd -ls
67584593    4 -rw-r--r--   1 root     root          188 Apr  1  2020 /etc/pam.d/passwd
69030856    4 -rw-r--r--   1 root     root         2315 Dec 24 19:59 /etc/passwd

# -exec ... \; 逐个处理
[root@zhb-m1 ~]# find /etc/ -name passwd -exec echo haha \;
haha
haha

# -exec ... {} \; 对文件本身动手:把某个 inode 的所有副本拷到当前目录
[root@zhb-m1 ~]# mkdir findfiles
[root@zhb-m1 ~]# find / -inum 67160130 -exec cp -a {} ./findfiles \;
[root@zhb-m1 ~]# ls findfiles/fstab
fstab

# -delete:先确认清单,再删
[root@zhb-m1 ~]# find / -name PASSWD
/etc/PASSWD
[root@zhb-m1 ~]# find / -name PASSWD -delete
[root@zhb-m1 ~]# find / -name PASSWD

四、实战:四条最常用的查询

场景 一条命令
找最近半小时动过的配置文件 find /etc -name '*.conf' -mmin -30
揪出超过 500M 的大文件 find / -type f -size +500M 2>/dev/null
清理 7 天前的旧日志 find /var/log -type f -name '*.log' -mtime +7 -delete
找无主 / 无组的残留文件 find / -nouser -o -nogroup 2>/dev/null

排查磁盘占用时,du 定位目录、find 定位文件,两条命令互相对照最快------见姊妹篇《Linux 文件系统管理与挂载实战》。

📚 参考资料(官方文档 · 中英双语)

附:命令英文全称速查表

命令 / 缩写 英文全称 / 原意 作用
find find files 实时遍历目录树查找文件
locate locate files by name 在数据库中按名称查文件
updatedb update database 重建 locate 用的文件名数据库
mlocate merged locate 带权限可见性控制的 locate 实现
basename base name 取路径最后一段
dirname directory name 取路径去掉最后一段后的目录
inode index node 文件在文件系统中的索引节点
UID / GID U ser / G roup IDentifier 用户 / 组标识号
FIFO F irst I n F irst Out 命名管道
SUID / SGID S et U ser / G roup ID 以文件属主 / 属组身份执行

总结locatefind 是一条互补的主线------日常「我记得文件叫 xxx」直接 locate,记得先 updatedb 刷新快照;一旦要按类型、权限、大小、时间这些维度筛,或者找到之后还要删、要拷、要批量执行,就换 find-perm 的三种前缀和时间参数的 +/- 方向是两处最容易翻车的细节。觉得有用的话,点赞收藏,评论区说说你用 find 干过最漂亮的一件事。

相关推荐
ITxiaobing20231 小时前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5551 小时前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
Julien20041 小时前
Docker 容器存储原理(一)
linux·运维·服务器·ssh·学习方法
半仙白桑1 小时前
内核篇第四讲:wait () 函数
linux·wait函数
zhangrelay1 小时前
《机器人控制器设计与编程》课程习题资料-2026
linux·笔记·学习·ubuntu
邪修king1 小时前
Re:Linux 系统篇(三十四):进程间通信开篇Chapter1 —— 匿名管道 pipe 深度拆解与代码实战
android·linux·运维·开发语言
花间相见1 小时前
【计算基础|网络04】—— HTTP接口实战(下):接口测试、鉴权与跨域排错
java·linux·人工智能·后端·python·计算机网络·postman
kkkkkkkkkk_Z2 小时前
新手自学嵌入式|学习日记:从C语言到51单片机基础(GPIO、中断、定时器与PWM篇)
linux·笔记·学习·51单片机
云运维笔记2 小时前
华为设备IP地址配置全攻略
运维·网络·计算机网络·华为