忘了配置文件放在哪、要按权限或大小批量筛文件、要清掉 30 天前的日志------这类活都归
locate与find。本文按「先选工具 → 再学匹配条件 → 最后批量处理」三步走: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 f、d、l、b、c、p、s |
| 属主与属组 | -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 天内改过的文件。
3.8 按硬链接数与 inode 匹配:-links / -inum
| 写法 | 作用 | 说明 |
|---|---|---|
-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的优先级高于-o。find . -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 | 以文件属主 / 属组身份执行 |
总结 :
locate与find是一条互补的主线------日常「我记得文件叫 xxx」直接locate,记得先updatedb刷新快照;一旦要按类型、权限、大小、时间这些维度筛,或者找到之后还要删、要拷、要批量执行,就换find,-perm的三种前缀和时间参数的+/-方向是两处最容易翻车的细节。觉得有用的话,点赞收藏,评论区说说你用find干过最漂亮的一件事。