Linux find 命令详解:按名字、类型、大小、时间查找文件,运维效率翻倍


服务器文件几千上万个,想找某个文件、清理占空间的大文件、删掉几天前的日志……用 ls 一个个翻根本不行。find 是 Linux 里最强大的文件查找工具:可以按文件名、类型、大小、修改时间、权限等任意条件搜索,还能直接对搜到的东西执行命令。这篇文章把它最常用的用法一次讲透,照抄即可用。

一、find 能干什么

find 会在指定目录树里递归搜索,并支持非常灵活的条件组合。与 grep 不同,find 找的是文件(不是文件内容),它是运维的"搜索神器"。

基本语法:

find [路径] [选项] [动作]

比如最简单的:列出当前目录下所有文件

find .

二、按名字找文件(最常用)

按文件名精确匹配:

find / -name "nginx.conf"

/ 表示全盘搜索,会搜到很多权限拒绝的提示,可在结尾加 2>/dev/null 屏蔽错误。-name 区分大小写;不区分大小写用 -iname。

用通配符模糊匹配(*、?):

find /var/log -name "*.log"
find /home -iname "*.tar.gz"
find / -name "error*"

注意:用 * 通配时要加引号,否则 shell 会先展开。

三、按类型找文件

用 -type 指定类型:

find / -type f           # 普通文件
find / -type d           # 目录
find / -type l           # 符号链接
find / -type f -name "*.conf"   # 组合:名字以 .conf 结尾的普通文件

四、按大小找文件(清理磁盘神器)

用 -size 配合 M/G/k(注意小写 m 是"块",用大写的 M 才是 MB):

find / -type f -size +100M        # 大于 100MB 的文件
find / -type f -size -10k         # 小于 10KB 的文件
find /var/log -type f -size +50M  # 找大日志
find / -type f -size +500M -exec ls -lh {} \;

平时查"哪个目录占了空间",这些命令就够用了。

五、按时间找文件(清日志、看近期改动)

时间类参数很常用:

  • -mtime:内容修改时间(天)
  • -atime:访问时间
  • -ctime:状态改变时间
  • -mmin / -amin:按分钟
find /var/log -mtime +30          # 30 天前修改过的(一般可以清理)
find / -mmin -10                  # 10 分钟内修改过的
find /tmp -atime +7               # 7 天没被访问的
find /var/log -name "*.log" -mtime +7

+30 表示"超过 30 天",-10 表示"10 天以内"。

六、按权限和属主找文件(安全排查)

find / -perm 777                  # 权限为 777 的文件
find /tmp -type f -perm /2000     # 含 setuid/setgid 位(安全项)
find / -user www-data             # 属主是 www-data 的文件
find / -group www -type f
find / -nouser                    # 属主不存在的孤文件

排查环境变重要的:find / -perm -2000 或 find / -type f -perm -1000 可以快速发现可疑的 setuid 文件。

七、对结果执行命令(-exec)

find 找到文件后可以直接干"活",这是它最实用的能力。固定格式是 -exec 命令 {} \;:

删除找到的文件(清日志、清缓存):

find /var/log -name "*.gz" -exec rm -f {} \;
find /tmp -type f -mtime +7 -exec rm -f {} \;

修改权限、移动、打包:

find /www -type f -exec chmod 644 {} \;
find /data -name "*.tmp" -exec mv {} /backup/ \;

+ 批量版(一次传给命令,更快):

find /var/log -name "*.log" -mtime +30 -exec rm -f {} +

八、与 grep、xargs 组合(终极武器)

配合 xargs 处理大量结果:

find . -name "*.txt" | xargs grep "error"
find /var -type f -name "*.log" -mtime +7 | xargs rm -f

用 -print0 与 xargs -0 处理带空格/特殊字符的文件名:

find . -name "*.png" -print0 | xargs -0 ls -la

找完直接看内容:

find / -name "*.conf" -exec grep -l "listen 80" {} \;

九、按目录深度限制

目录太深、结果太多时:

find / -maxdepth 2 -name "*.conf"     # 最多往下搜 2 层
find / -mindepth 2 -type f
find /www -maxdepth 1 -type d          # 只看一层目录

maxdepth 1 只看当前层,很适合列目录结构。

十、综合实战:几个拿来即用的命令

1. 全盘找大文件(排第一的往往是磁盘大户):

find / -type f -size +200M -exec ls -lh {} \;

2. 清理 7 天前的大日志:

find /var/log -name "*.log" -mtime +7 -exec rm -f {} \;

3. 统计某目录下文件数量:

find /www/html -type f | wc -l

4. 找一个具体配置文件(如 nginx.conf):

find / -name "nginx.conf" 2>/dev/null

5. 快速定位被污染的 PHP 文件(安全排查常用思路):

find /www -name "*.php" -mtime -1

十一、常见问题

Q1:搜索很慢 / 结果很多?

用 -maxdepth 限制深度,加上 2>/dev/null 屏蔽无权访问的报错。能指定精确路径就别用 /。

Q2:-name 加不加引号有区别吗?

有。find / -name *.log 不加引号,* 会被 shell 先展开(只匹配当前目录)。加引号 "*.log" 才让 find 自己处理,分别匹配每一级。

Q3:删文件没删掉?

确认路径、引号、-exec ... \; 结尾的分号要转义。可以先不加 -exec,先看 find 列出的是不是想要的,再执行删除。

Q4:想按修改时间排序?

可以交给 sort:find . -type f -printf '%T@ %p\n' | sort -n | tail

总结

find 是 Linux 文件搜索的核心命令:-name 按名字、-type 按类型、-size 按大小、-mtime 按时间、-exec 对结果执行动作,搭配 xargs 和 grep 几乎能做任何文件处理任务。多记几个组合,日常排查、清理日志、找大文件都能一招搞定。配合本站的 grep、rsync、磁盘清理教程,服务器文件管理就顺手了。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux tar 命令详解:tar.gz 打包压缩、解压解包、增量备份,一个命令全搞定

网站 SEO 优化教程:标题关键词、TDK设置、URL伪静态与收录,让搜索流量涨起来

评 论
更换验证码