find · 侦探模式

上游:ls(先会 ls,再学 find 的深度搜索)· cd(知道在哪里搜) 下游:grep(find 找到文件,grep 搜文件内容)· chmod(find 找到文件后批量改权限) 参见:apt(用 find 找 apt 把软件装到哪里了)


一句话是什么

find 在整个文件系统里搜索文件——按名字、按类型、按时间、按大小, 就像侦探用放大镜在城市里追踪一个人。


为什么需要它

ls 只能看当前目录里有什么,找不到藏在深处的文件。

# ls:只看一层
ls ~/学习基地/
# 第1周/  第2周/  第3周/
 
# find:搜索所有层
find ~/学习基地/ -name "*.md"
# ~/学习基地/第1周/任务A.md
# ~/学习基地/第1周/任务B.md
# ~/学习基地/第2周/任务A.md
# ~/学习基地/第3周/任务C.md

真实场景

  • 你记得文件名叫 server.properties,但不知道在哪个目录
  • 你想找所有 .log 日志文件清理空间
  • 你想找 3 天内改过的文件
  • apt install unzip 之后,想知道 unzip 装到哪里了

核心用法

公式

find [搜索起点] [条件] [动作]

常用命令表

操作命令说明
按文件名搜索find ~ -name "文件名"在家目录搜
模糊搜索find ~ -name "*.md"所有 .md 文件
忽略大小写find ~ -iname "README*"大小写不敏感
只找目录find ~ -type d -name "第*"找名字以”第”开头的目录
只找文件find ~ -type f -name "*.sh"找所有 .sh 文件
按大小搜索find ~ -size +100M超过 100MB 的文件
按时间搜索find ~ -mtime -33 天内修改过的文件
找到后执行find ~ -name "*.log" -delete找到所有 log 文件并删除

搜索起点

find .       # 当前目录(最常用)
find ~       # 家目录
find /       # 整个系统(慢,要加 sudo)
find /etc    # 系统配置目录

Linux 笑话

Aaron 的 Minecraft 服务器文件解压完, 找不到 server.properties 在哪里:

$ ls ~/mc-server/
bedrock_server  start.sh  还有好多文件...

文件太多,眼睛找不到。他用了 find:

$ find ~/mc-server/ -name "server.properties"
/home/aaron/mc-server/server.properties

找到了。他又试了一个:

$ find ~/mc-server/ -name "我的世界.exe"
(没有输出)

Minecraft Bedrock Server 在 Linux 上没有 .exe, Linux 的可执行文件没有后缀。

他学到了:Windows 的直觉在 Linux 不管用, Linux 的可执行文件不叫 .exe,叫 bedrock_server(没有后缀)


参数拟人化拆解 · find 怎么变身侦探

find 不只是”找文件”——每个参数都让侦探换一套装备、换一种打法。

-name vs -iname · 名字识别

参数行为例子
-name "abc"”严格按字面找”——大小写敏感-name "README" 找不到 readme
-iname "abc"”戴上忽略大小写的眼镜”-iname "README" 同时匹配 readme.mdREADME.txt

通配符(写在引号里,否则 shell 会先抢着展开):

  • * = 任意多个字符(包括 0 个)
  • ? = 恰好 1 个字符
  • [abc] = a、b、c 中任一个

例:find ~ -name "*.[ch]" = 找所有 .c.h 后缀的文件。

-type · 限定”我只找哪种东西”

参数找什么
-type f普通file(最常用)
-type ddirectory(只找目录)
-type llink(符号链接)
-type ssocket(程序间通信用)

不加 -type = 文件、目录、链接全都返回,结果常常太多。 实战几乎每次都加 -type f

-mtime / -atime / -ctime · 时间筛选三兄弟

参数含义拟人化
-mtimemodify time”上次内容被改的时间”(最常用)
-atimeaccess time”上次被读取的时间”
-ctimechange time”上次元数据(权限/主人)被改的时间”

数字符号决定方向

  • -mtime -7 → 7 天之内改过的(“小于 7 天”)
  • -mtime +7 → 7 天之前改过的(“大于 7 天”)
  • -mtime 7正好 7 天前那一天改过的(很少用)

-size · 大小筛选

单位含义
c字符(字节)
kKB
MMB
GGB

符号同 -mtime

  • -size +100M = 大于 100MB
  • -size -1k = 小于 1KB(找空文件直接用 -empty 更清晰)

-exec · 找到之后立刻干一件事

find ~/学习基地 -name "*.tmp" -exec rm {} \;

逐字翻译:

  • -exec:开关——“对每个找到的文件执行后面的命令”
  • rm:要执行的命令
  • {}:占位符,find 会把找到的文件名一个个替换进去
  • \;:命令结束符(反斜杠 + 分号;反斜杠是为了不让 shell 误把分号当命令分隔符)

Aaron 常见踩坑

坑 1 · 不加引号

find ~ -name *.md
# 当前目录恰好有 .md 文件时,shell 会先把 *.md 展开成那些文件名传给 find,结果错乱
find ~ -name "*.md"   # ✅ 加引号让 find 自己处理通配符

坑 2 · 忘了 -type f

find / -name backup
# 可能返回一堆名为 backup 的目录、文件、链接……信息淹没
find / -type f -name backup   # ✅ 只要文件

例题精讲

📗 初探 Starter — 找到安装好的程序在哪里

任务:安装 tree,然后用 find 找到它被装到哪里了。

# 第一步:安装 tree
sudo apt install tree
 
# 第二步:用 find 搜索
find /usr -name "tree" -type f
# /usr/bin/tree
 
# 第三步:验证是否可执行
ls -la /usr/bin/tree
# -rwxr-xr-x 1 root root ... /usr/bin/tree
 
# 第四步:用 which(更快的方式,了解即可)
which tree
# /usr/bin/tree

你学到了什么apt install 把程序装在 /usr/bin/ 里, 这是 Linux 标准程序目录。find /usr -name "程序名" 是万能找法。


📘 应用 User — 清理学习基地的临时文件

任务:找到学习基地里所有超过 30 天没有修改的文件。

# 找 30 天以上没改动的文件
find ~/学习基地/ -type f -mtime +30
 
# 找最近 3 天改过的文件(找自己的新作业)
find ~/学习基地/ -type f -mtime -3
 
# 找大于 1MB 的文件(清理大文件)
find ~/学习基地/ -type f -size +1M
 
# 找所有空文件(可能是未写完的)
find ~/学习基地/ -type f -empty

你学到了什么

  • -mtime +N = 超过 N 天没改(+ 是”大于”)
  • -mtime -N = N 天内改过(- 是”小于”)
  • -size +1M = 大于 1MB

📙 管理 Admin — 批量操作找到的文件

任务:找到 mc-server 里所有 .log 文件,显示大小,再清空它们。

# 第一步:找到所有日志文件
find ~/mc-server/ -name "*.log" -type f
 
# 第二步:显示每个日志文件的大小
find ~/mc-server/ -name "*.log" -type f -exec ls -lh {} \;
 
# 第三步:找到超过 10MB 的日志(需要清理的)
find ~/mc-server/ -name "*.log" -size +10M
 
# 第四步:清空(不删除,只清空内容,日志程序还能继续写入)
find ~/mc-server/ -name "*.log" -type f -exec truncate -s 0 {} \;
 
# 如果想直接删除
find ~/mc-server/ -name "*.log" -type f -delete

-exec 命令 {} \; 解释

  • {} = 代表 find 找到的每个文件名(占位符)
  • \; = 表示命令结束
  • 意思:对每个找到的文件,执行后面的命令

你学到了什么find + -exec 是 Linux 批量操作的神器, 找到文件,立刻对它们做点什么。


官方文档参考

man find         # 完整手册
find --help      # 快速选项列表

find 逐层遍历目录树,对每个文件依次评估表达式;不加起点默认从 . 开始。 在线:https://manpages.ubuntu.com/find


节点链接

上游(先会这些,才能用 find 的结果)

  • ls ← find 是 ls 的升级版,先会 ls
  • cd ← 进入要搜索的目录
  • pwd ← 确认自己在哪里

同层(侦探工具组合)

  • grep ← find 找文件位置,grep 搜文件内容;两个是黄金搭档

下游(找到文件之后)

  • grep ← 找到文件后,用 grep 搜里面的内容
  • chmod ← 批量修改找到的文件权限(find -exec chmod)
  • tar ← 把找到的文件打包备份

管道组合(高级)

  • 管道 ← find 的输出通过管道传给其他命令

节点版本:v1.0 · 2026-04-20 下一个节点建议:grep管道