find 命令速查表 - Linux 文件搜索常用命令大全
locate 靠数据库查、快但可能过期,find 现算、慢但准——需要按大小、时间、权限过滤,或要在结果上直接执行动作时,只有 find 做得到。六个维度:By Name 配 -iname 忽略大小写,By Type 用 -type d/f/l 区分,By Size 用 -size +100M 按块筛,By Time 用 -mtime -1 找近期改动,By Permission 按位掩码筛可执行文件,By Owner 定位别人留下的垃圾。Actions 是它相对 ls 不可替代之处:-exec 逐个处理,-exec ... + 批量喂入摊薄进程启动,-delete 直接删。判断标准比命令更重要:默认跟随符号链接且无深度上限,大目录树上要靠 -maxdepth 和 -prune 收住;-prune -o -print 顺序写反会打印本该剪掉的目录。
典型使用场景
线上磁盘告警涨到 90% 却又不知道是哪个目录在膨胀,这是 find 最高频的应用场景。先用 du 看目录总览,再用 find . -type f -size +1G 直接列出超过 1G 的大文件,用 -mtime -3 找出最近三天动过的文件——往往就是异常日志或临时文件。找到元凶后,配合 -exec 或 -delete 一键清除过期的 .log/.tmp,清理磁盘占用时比满盘翻目录表高效得多。
按名称查找 By Name 6
find . -name "file.txt"find . -iname "file.txt"find . -name "*.log"find . -name "file*"find /var/log -name "*.gz"find . -maxdepth 2 -name "*.log"按类型查找 By Type 5
find . -type ffind . -type dfind . -type lfind . -type f -name "*.sh"find . ! -type d按大小查找 By Size 5
find . -size +100Mfind . -size -1kfind . -emptyfind . -size 0find . -size +10M -size -100M按时间查找 By Time 5
find . -mtime -7find . -mtime +30find . -mmin -60find . -atime -1find . -newer file.txt按权限查找 By Permission 4
find . -perm 755find . -perm -u+xfind . -perm /o+wfind . -perm -g=w按用户查找 By Owner 5
find . -user tomfind . -group devfind . -uid 1000find . -nouserfind . -nogroup执行操作 Actions 7
find . -name "*.tmp" -deletefind . -name "*.sh" -exec chmod +x {} \;find . -name "*.log" -exec rm {} +find . -name "*.txt" -printfind . -name "*.bak" -ok rm {} \;find . -name node_modules -prune -o -name "*.js" -printfind . -type f -exec ls -lh {} + | sort -k5 -rh参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-name | 按文件名匹配,支持通配符,区分大小写 | find . -name "*.log" |
-iname | 与 -name 同义但忽略大小写,用于扩展名大小写混写的目录 | find . -iname "file.txt" |
-maxdepth / -mindepth | 限制递归层数,避免在大目录树上做无意义的全树扫描 | find . -maxdepth 2 -name "*.log" |
-type f / -type d / -type l | 按节点类型过滤:普通文件、目录、符号链接,是后续动作安全的前提 | find . -type f |
! -type d | 取反排除目录,输出其余全部节点(含符号链接等特殊文件) | find . ! -type d |
-size +100M / -size -1k | 按体积筛文件,正号取大于、负号取小于,定位磁盘占用元凶 | find . -size +100M |
-size +10M -size -100M | 把两个 -size 叠成区间,只保留落在两个门限之间的文件 | find . -size +10M -size -100M |
-empty / -size 0 | 命中空文件与空目录,或只命中体积为 0 的文件 | find . -empty |
-mtime -7 / -mtime +30 | 按修改时间取窗口:负号是最近 N 天内,正号是 N 天之前 | find . -mtime -7 |
-mmin -60 | 把时间粒度压到分钟,用于刚被改动过的日志与配置 | find . -mmin -60 |
-newer file.txt | 以某个文件的修改时间为基准,找比它更新的文件 | find . -newer file.txt |
-perm 755 / -perm -u+x / -perm /o+w | 权限匹配三种写法:精确等于、包含某位、按位或,语义完全不同 | find . -perm /o+w |
-user / -group / -uid | 按归属过滤,用于清理特定账号或特定组产出的文件 | find . -user tom |
-nouser / -nogroup | 命中无所有者或无所属组的条目,是账号被删除后遗留文件的信号 | find . -nouser |
-delete | 直接删除匹配项,无需再接外部命令,会真实改动文件系统 | find . -name "*.tmp" -delete |
-exec {} \; | 为每个匹配项单独起一条命令,可处理含空格与换行的路径 | find . -name "*.sh" -exec chmod +x {} \; |
-exec + | 把所有匹配项攒成一批参数再执行一次,进程开销远小于逐个执行 | find . -name "*.log" -exec rm {} + |
-ok | 逐个交互确认后才执行,批量动作前唯一的天然护栏 | find . -name "*.bak" -ok rm {} \; |
-prune | 剪掉整棵子树(如 node_modules),排除目录后继续匹配其余文件 | find . -name node_modules -prune -o -name "*.js" -print |
-print | 先只打印命中路径做只读预演,确认无误后再换成删除动作 | find . -name "*.txt" -print |
易错点与避坑指南
现象删完发现文件还在原处,或者本想保留的目录内容被清掉了。
原因-exec 与 -delete 在遍历过程中就动文件系统,路径写宽时错删无法回退。
处置先把动作换掉,用 find . -name "*.txt" -print 这类只读组合跑出命中列表逐条核对,确认后再补上 -delete。
现象在大目录上跑 find,终端半天没输出,最后像是卡死了。
原因find 默认从起点一路递归到叶子节点,每进入一个目录都要读一遍目录项,目录数量一大就非常慢,与磁盘是否损坏无关。
处置先用 find . -maxdepth 2 -name "*.log" 限定深度与范围把范围缩小,不必扫描的目录用 -prune 剪掉,再逐步放开条件。
现象同一个文件在两次运行的结果里一会儿在、一会儿不在。
原因遍历过程中目录内容仍在被其它进程改动(应用正在写日志、构建正在落盘),find 读到的是移动中的目录树。
处置把范围收紧到具体目录并加 -maxdepth 2 限定层数,或等写入停止后再跑,避免在业务高写入期做全量统计。
现象在大目录上用 -exec 逐个执行,跑了几分钟才结束。
原因逐个执行的写法为每个匹配项启动一次进程,命中数上万时进程创建与调度成本压过了命令本身的耗时。
处置换成批量形式 find . -name "*.log" -exec rm {} +,一次把所有路径交给同一条命令处理。
现象目标明明存在,find 却报告没有那个文件或目录。
原因路径含空格、通配符等 shell 特殊字符时,若模式没有加引号,shell 会先把它展开成当前目录下的名字,find 收到的已不是原模式。
处置模式一律用引号包住(如 find . -name "*.log"),并确认相对路径写法与 find 的起点一致。
现象用 -empty 清理后目录结构塌了,程序启动失败。
原因-empty 同时命中空文件与空目录,删掉构建产物里的空目录后,依赖该目录结构的工具链随即失效。
处置把清理范围限定为普通文件,例如 find . -type f -empty -delete 只处理文件而不动目录。
现象想排除 node_modules,结果整个结果集是空的。
原因-prune 返回真时会把整个分支剪掉,若没有被 -o 正确分隔,剪枝条件会连带吞掉后面本该继续的匹配。
处置用 -o 把两侧条件并列写成 find . -name node_modules -prune -o -name "*.js" -print,确认条件没有被括号改写。
现象按权限统计出来的数量和预期差一个数量级。
原因-perm 755 要求权限恰好等于 755,文件只要多一个 setuid 位或组位不同就落选;而 -perm -u+x 与 -perm /o+w 是包含与按位或语义,命中面大得多。
处置先明确要的是精确相等还是包含关系:精确用 find . -perm 755,包含用 find . -perm -u+x,宽松排查用 find . -perm /o+w。
现象报告里同时混进文件和目录,看起来像重复统计。
原因不带 -type 的匹配会把目录一并算进来,而 find . -type f 与 find . -type d 遍历的是同一批路径,合并结果时不去重就会重复。
处置明确写出类型条件,或用 find . ! -type d 只保留非目录项,并在汇总时确认两侧是否重叠。
现象统计「最近改动的文件」结果为空。
原因时间条件的正负号语义容易记反:-mtime -3 才是最近 3 天内,-mtime +3 是 3 天之前,写反之后窗口正好落在空区间。
处置先用 find . -mtime -7 验证窗口方向,确认有输出再换成 -mtime +30 这类更早的时间点。
排障路径
1先缩小范围,确认递归深度与过滤条件按预期生效
find . -maxdepth 2 -name "*.log"加上 -maxdepth 后结果应当只有两层以内;输出为空说明当前层没有匹配,输出过多说明该换更严的条件。
2按体积排序,定位真正吃磁盘的文件
find . -type f -exec ls -lh {} + | sort -k5 -rh倒序排序后输出的头几行就是体积最大的文件;若这一步很慢,先加 -maxdepth 限定范围。
3只保留落在某个体积区间的文件
find . -size +10M -size -100M两个 -size 叠加即为区间条件,输出为空说明这个体积段内没有文件,不是命令写错。
4排除大目录后继续匹配其余文件
find . -name node_modules -prune -o -name "*.js" -print命中的 node_modules 及其子目录完全不出现在输出中,其余 .js 文件正常列出,说明 -o 的并列关系正确。
5按权限找出别人可写的文件,做一次安全巡检
find . -perm /o+w有输出即说明存在其他人可写的文件,逐条核对是否为有意开放的目录(例如共享缓存)。
6排查账号被删除后遗留的无主文件
find . -nouser输出里的路径没有对应用户,说明属主已不在系统里,这些文件需要重新指派归属或清理。
7核对权限位时用符号写法,而不是精确数字
find . -perm -u+x这条命中所有用户可执行的文件;若与预期差距很大,再换 find . -perm 755 看精确等于 755 的那一批。
命令示例
列出当前目录下超过 1GB 的文件
find . -type f -size +1G-size +1G 匹配大于 1G 的普通文件;取消 -type f 则会连带把大目录也算进去。
输出
./backup/dump.sql ./media/concert_4k.mp4
查找最近 3 天修改过的配置文件
find /etc -type f -mtime -3-mtime -3 表示最近 3 天内(含)修改过,=3 是恰好 3 天前,+3 是 3 天之前,方向别弄反。
输出
/etc/nginx/nginx.conf /etc/hosts
删除 30 天前的历史日志
find /var/log -name "*.log" -mtime +30 -delete-delete 是真实的删除操作且无输出,建议先去掉该参数跑一遍确认命中范围,再用 -exec rm {} \; 或直接启用。
常见坑与注意事项
- find 默认递归扫描整棵目录树,在大目录上很慢;先用 -maxdepth 限定深度,或用 -prune 跳过不必扫描的目录。
- 时间筛选 -mtime 的 N 有三种语义:-3=最近 3 天内,3=恰好 3 天前,+3=3 天之前,混用极易选错范围。
- -exec 与 -delete 会真实改动文件,务必先不带它们跑出命中列表,确认无误后再真正执行删除或操作。
- 符号链接默认不被跟随,需要跟随时用 -L 或 -follow;否则某些目标会漏掉或行为与预期不同。
- 想用它匹配名称含空格的目录时,注意 find 的匹配和 shell glob 不同,模式最好加单引号避免被提前展开。
提示
- find 默认递归查找当前目录及子目录,用 -maxdepth 1 限制只查当前目录。
- -exec 用 {} 代表找到的文件,\; 表示每个文件执行一次,+ 表示批量执行。
- 删除文件前先用 -print 确认匹配结果,避免误删。
- find . -name "*.log" -mtime +30 -delete 在匹配里直接叠加时间条件,比先列出再 xargs rm 少一轮管道,也少一次手滑。
- -printf "%s %p\n" 能直接输出字节数,配合 sort -n 就能排出最大的几个文件,比 du -a 快且不受目录结构干扰。
- 查找时用 -xdev 限制不跨文件系统,扫描 / 时可以避免跑进 proc、sysfs 等虚拟文件系统而卡住。
常见问题
find 的 -exec 和 xargs 到底怎么选?
结果少、命令简单时用 -exec {} + 或 -exec {} \; 在 find 内部批量执行;结果多或要对每项做复杂处理时改用 xargs,务必在 find 侧配 -print0、xargs 侧配 -0,否则文件名含空格或换行时会出错。
find 找到的文件怎么安全地删除?
最稳妥是直接给 find 加 -delete,它会在条目所在目录内就地删除命中的文件且不经过别名。若要用管道,优先 find ... -print0 | xargs -0 rm;别用裸 xargs rm 或反引号包 find 的方式,遇到特殊文件名会误删或报错。
想同时找多种文件(比如 txt 和 log)怎么写条件?
用成对括号把各 -name 条件与 -o 组合,并让它和默认的隐式 -a 配好,例如把匹配 txt 与匹配 log 的两个 -name 放进一对括号,后面再接 -type f。不加括号时 -o 会和 -a 的优先级混在一起,结果往往不是你想找的。
为什么 find -name 不等于按路径匹配?
-name 只匹配文件名(basename)而不管目录部分,-path 才按完整路径匹配。要按多层路径筛选或排除目录时改用 -path 搭配 -prune;同时建议先用 -maxdepth 限定范围,避免全盘递归扫描。
按修改时间过滤时,-mtime 和 -mmin 的正负号和数字是什么意思?
-mtime N 表示修改于 N 天前那个 24 小时内,-mtime -N 表示最近 N 天以内,-mtime +N 表示 N 天以前;精确到分钟用 -mmin,例如 -mmin -30 表示最近 30 分钟内。注意 -mtime 按整天取整,长短边界容易踩坑。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。