Linux查找文件命令之find、locate、which、whereis实战

 更新时间:2026年09月18日 09:30:28   作者:程序员Benothing  
还在为找不到Linux文件发愁,本文一次讲透find、locate、which、whereis四大查找命令,附实战示例和避坑指南,无论你是想快速定位nginx.conf,还是批量清理大日志文件,都能在这里找到答案,需要的朋友可以参考下

开篇:

“那个 nginx.conf 到底在哪?”——这是每个 Linux 新手和老手都会遇到的灵魂拷问。

有一次我接手一台"祖传"服务器,前同事把 Nginx 装在了编译目录里,配置文件既不在 /etc/nginx 也不在 /usr/local/nginx/conf。我用了三招定位:

which nginx            # 找到可执行文件在哪个目录
find / -name "nginx.conf" 2>/dev/null   # 全盘找配置文件

三分钟内就锁定了目标。查找文件,是 Linux 运维和开发的高频刚需。今天我们把 findlocatewhichwhereis 四个查找命令一次讲透,并说清它们各自适合什么场景。

一、四个命令的定位:一张表先建立全局观

命令查找对象查找依据速度适用场景
find任意文件/目录实时扫描目录树,按名字/类型/大小/时间等条件慢(但功能最强)精确、复杂条件查找
locate文件名查询预建数据库(updatedb)极快模糊记得名字的快速查找
which可执行命令搜索 PATH 环境变量极快命令装在哪个目录、是否已安装
whereis可执行命令及其文档搜索标准目录 + PATH同时找二进制、源码、man 手册

一句话记忆:which/whereis 找命令,locate 快速找文件,find 精确找一切

二、find:功能最强的"搜索机器"

语法格式

find [起始路径] [匹配条件] [动作]

起始路径不写默认是当前目录 .find 会递归遍历目录树,逐项匹配条件,最后执行动作(默认动作是打印路径)。

常用匹配条件

条件说明示例
-name "模式"按文件名(支持通配符,需加引号)-name "*.log"
-iname "模式"忽略大小写的文件名-iname "Readme*"
-type f/d/l按类型:文件/目录/符号链接-type f
-size +100M按大小(+ 大于、- 小于)-size +1G
-mtime +7按修改时间:7 天前(+7)/7 天内(-7-mtime -1
-user 用户名按属主-user www-data
-perm 644按权限-perm -4000(找 SUID)
-maxdepth N限制递归深度-maxdepth 2
-empty空文件/空目录-empty

常用动作

动作说明
-print打印路径(默认动作)
-exec 命令 {} \;对每个结果执行命令,{} 是结果占位符
-delete直接删除匹配的文件
-lsls -l 格式列出详细信息

实战示例与预期输出

示例 1:按名字和类型查找

find /etc -name "*.conf" -type f | head -5

预期输出:

/etc/rsyslog.conf
/etc/adduser.conf
/etc/deluser.conf
/etc/logrotate.conf
/etc/ucf.conf

示例 2:找出 7 天前修改的大日志文件

find /var/log -name "*.log" -mtime +7 -size +100M -ls

这条命令把"超过 7 天没动过、且大于 100MB 的日志"列出来,配合第 92 篇的 logrotate 思路,就是清理磁盘的第一步。

示例 3:对结果批量执行命令——删除临时文件

find /tmp -name "*.tmp" -type f -exec rm -f {} \;

这里 {} 逐个替换为找到的文件路径,\; 表示 -exec 命令结束(注意分号前有反斜杠)。

示例 4:统计某目录下普通文件数量

find /var/log -type f | wc -l

预期输出(示例值):

128

常见错误与注意事项

  1. -name 的通配符必须加引号:写成 find / -name *.log 时,Shell 会在 find 执行前先把 *.log 展开,往往匹配不到或匹配错误。正确写法是 -name "*.log"
  2. 权限报错刷屏find / -name x 会遍历整个系统,遇到无权访问的目录会刷出一堆 Permission denied。加 2>/dev/null 屏蔽错误输出。
  3. -delete 慎用:它删除后不可恢复,务必先 -print 预览再删。
  4. -exec 别忘 {}\;:格式写错会报 find: missing argument to -exec

三、locate:数据库加持的"秒查"

locate 的查找速度是"秒回",因为它不扫描磁盘,而是查询一个预先建好的文件名数据库

语法格式

locate [选项] 关键词

常用参数

参数说明
-i忽略大小写
-c只输出匹配数量
-r 正则用正则匹配
-n 数字只显示前 N 条

示例与预期输出

示例:找名字里带 docker 的文件

locate docker | head -10

预期输出(节选):

/etc/apparmor.d/docker
/etc/bash_completion.d/docker
/usr/bin/docker
/usr/share/man/man1/docker.1.gz

注意事项

数据库不会实时更新。刚创建的文件 locate 可能找不到,需要先更新数据库:

sudo updatedb    # Ubuntu/Debian

CentOS/Rocky 使用 yum install mlocate 安装后同样有 updatedb。另外有些发行版默认不装 locate(如新版 Ubuntu 用 plocate),装一下即可。

常见错误:以为 locate 找不到就说明文件不存在——它可能只是数据库过期了。

四、which:命令"藏"在哪个目录

which 沿着 PATH 环境变量里的目录逐个查找,返回可执行命令的完整路径。

语法格式

which [选项] 命令名

常用参数

参数说明
-a显示所有匹配路径(PATH 中可能有多个同名)
-i忽略大小写(GNU 版本)

示例与预期输出

示例:查 python3 在哪、是否已安装

which python3

预期输出:

/usr/bin/python3

如果没安装则无输出(退出码为 1)。因此 which 常被写进脚本做依赖检查:

which git || { echo "git 未安装"; exit 1; }

小知识:which 只看 PATH,如果某个命令是通过完整路径调用(如 /opt/app/bin/tool),which tool 是找不到的,用 type -a toolfind 兜底。

五、whereis:连源码和文档一起找

whereiswhich 更进一步,它会去标准目录搜索,同时返回二进制、源码和 man 手册的位置。

语法格式

whereis [选项] 命令名

常用参数

参数说明
-b只找二进制文件
-m只找 man 手册
-s只找源码

示例与预期输出

示例:查 nginx 的所有相关文件

whereis nginx

预期输出:

nginx: /usr/sbin/nginx /usr/share/man/man8/nginx.8.gz

如果你想看某个命令的手册位置,whereis -m ls 就能给出 /usr/share/man/man1/ls.1.gz

六、知识扩展:find 的 -exec 与管道 xargs 的取舍

find -exec rm -f {} \;find ... | xargs rm -f 都能批量处理结果,区别在哪?

对比项-exec ... \;管道 + xargs
执行方式每个文件起一个子进程批量打包成参数,一次执行多次
处理特殊文件名安全(逐项传参)需加 -print0 + -0 配合,否则空格/换行文件名会出错
速度慢(进程开销大)

推荐做法:文件名简单时用 xargs(配合 -print0 更稳),追求稳妥或文件少时用 -exec。关于 xargs 的深入用法(-n-I-P 并行),第 19 篇专门展开。

另一个知识点:find条件默认是 AND(与),比如 -name "*.conf" -type f 表示两个条件同时满足。如果要表达 OR,用 -o 并配合括号:find /etc \( -name "*.conf" -o -name "*.ini" \)。注意括号要转义或加引号,否则 Shell 会把它当子 shell。

以上就是Linux查找文件命令之find、locate、which、whereis实战的详细内容,更多关于Linux查找文件命令大全的资料请关注脚本之家其它相关文章!

相关文章

  • nginx 下安装配置 phpadmin报错的解决方法

    nginx 下安装配置 phpadmin报错的解决方法

    下面小编就为大家带来一篇nginx 下安装配置 phpadmin报错的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 处理Shell脚本中带有空格的变量(bash脚本)

    处理Shell脚本中带有空格的变量(bash脚本)

    这篇文章主要介绍了处理Shell脚本中带有空格的变量,本文主要是通过bash脚本对于含空格文件处理方法,需要的朋友可以参考下
    2020-02-02
  • Shell踢人的三种方法

    Shell踢人的三种方法

    这篇文章主要介绍了Shell踢人的三种方法,首先用w查看当前登录用户,运行w命令的是当前用户,需要保留,其他一概踢掉,需要的朋友可以参考下
    2014-12-12
  • shell脚本编写俄罗斯方块

    shell脚本编写俄罗斯方块

    这篇文章主要为大家详细介绍了shell脚本编写俄罗斯方块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 详解Linux下find查找文件命令和grep查找文件命令

    详解Linux下find查找文件命令和grep查找文件命令

    在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep,两个命令是有区的,今天通过本文给大家介绍下Linux下查找文件(find、grep命令),感兴趣的朋友一起看看吧
    2022-04-04
  • linux shell之文件锁

    linux shell之文件锁

    经常在 shell 脚本里要阻止其它进程,比如 msmtp 自带的mail queue 脚本,这个脚本的互斥做法是不正确的,下面介绍下发现的三个通过文件达到互斥的正确做法
    2016-08-08
  • 浅谈Linux中的mkdir -p及基础用法

    浅谈Linux中的mkdir -p及基础用法

    mkdir是一个用于创建目录(目录树)的 Unix 和 Linux 命令, -p 选项允许创建一个目录和它不存在的父目录,这篇文章主要介绍了Linux中的mkdir -p,需要的朋友可以参考下
    2023-09-09
  • 使用Shell脚本和Java实现批量修改文件名功能

    使用Shell脚本和Java实现批量修改文件名功能

    在日常开发与系统管理中,我们常常需要对大量文件进行统一命名处理,Linux Shell 提供了强大而灵活的文本与文件处理能力,可以轻松实现批量重命名,本文将带你从零开始,深入掌握 Shell 批量重命名的各种技巧,并辅以 Java 代码示例,需要的朋友可以参考下
    2026-03-03
  • Linux中查看服务器内存/CPU/网络占用情况的命令

    Linux中查看服务器内存/CPU/网络占用情况的命令

    这篇文章主要为大家整理了一些Linux中查看服务器内存、CPU和网络占用情况的命令,文中的示例代码简洁易懂,需要的小伙伴可以参考一下
    2023-08-08
  • Linux 删除和替换文件中某一行的方法【推荐】

    Linux 删除和替换文件中某一行的方法【推荐】

    这篇文章给大家介绍了Linux 删除和替换文件中某一行的方法,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05

最新评论