马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
find 是什么
find 是 Linux 下最常用的文件查找命令,它按条件遍历目录树,把符合标准的文件和目录找出来。条件可以是文件名、大小、修改时间、属主、权限、文件类型等,组合能力很强。
几乎所有 Linux 发行版都预装了 find(Ubuntu、Debian、Fedora、RedHat、CentOS 等),一般不需要额外安装。
基本语法
find [路径...] [表达式]
路径:从哪开始找,给多个路径就分别遍历,省略则默认当前目录。
表达式:由选项、测试条件、动作组成的组合。没有表达式时默认打印全部(等价 -print)。
常用参数一览
| 参数 | 作用 |
-name 名字 | 按文件名匹配,支持通配符 |
-size 大小 | 按文件大小匹配,如 +10M |
-type 类型 | 按文件类型,-type d 找目录、-type f 找普通文件 |
-mtime n | 按内容修改时间(单位:天) |
-mmin n | 按修改时间(单位:分钟) |
-user 用户 / -group 组 | 按属主 / 属组 |
-perm 权限 | 按权限位匹配 |
-empty | 找空文件或空目录 |
-exec 命令 {} \; | 对查到的每个文件执行命令 |
常用类型字母:f 普通文件、d 目录、l 符号链接、b 块设备、c 字符设备、s 套接字。
15 个实用实例
1. 按文件名精确查找
find / -name filename
2. 找大于 1MB 的文件
find / -size +1M
+1M 表示"大于",-1M 表示"小于",不带符号表示"等于"。单位还能用 k(KB)、G、b(512 字节块)。
3. 当前目录及子目录下所有 .txt 文件
find . -name "*.txt"
通配符要用引号包起来,否则 shell 会先在本地展开,条件就歪了。
4. /home 下所有以 .log 结尾的文件
find /home -name "*.log"
5. /home 下属主是 root 且大于 10MB 的文件
find /home -user root -size +10M
6. 当前目录下 5 天内修改过的文件
find . -mtime -5
时间参数的符号规律:-n 是 n 以内(更近),+n 是 n 以外(更早),n 就是大约第 n 天。
7. 找出所有空目录
find / -empty -type d
8. /var/log 下最近 5 分钟内被修改的文件
find /var/log -mmin -5
-mmin 把时间精度提到分钟,排查"刚刚有没有写日志 "用它比 -mtime 准。
9. 查找并删除所有 .tmp 文件
find / -name "*.tmp" -exec rm {} \;
警告:这条命令威力很大,尤其是在根目录下执行。删除前务必先只查不删看一眼清单:find / -name "*.tmp",确认无误再执行;更稳妥的做法是先换成 -ok 代替 -exec,它会对每个文件询问是否执行。
10. 查找并 ls 显示详细信息
find / -name "*.sh" -exec ls -lh {} \;
注意 {} 是占位符,代表当前找到的文件,结尾的 \; 里分号要转义,否则 shell 会当成命令分隔符。
11. 当前目录下权限为 755 的普通文件
find . -type f -perm 0755
12. /home 下属于 root 的文件
find /home -owner root
13. /home 下 10 到 15 天前修改的文件
find /home -mtime +10 -mtime -15
14. /etc 下 10 天以前修改过的 .log 文件
find /etc -name "*.log" -mtime +10
15. /var/log 下 10 天内被访问过的 .log 文件
find /var/log -name "*.log" -atime -10
时间类参数有三组:-atime 访问时间、-mtime 内容修改时间、-ctime 属性变更时间(权限、属主变动也会触发)。
几个进阶写法
用 xargs 替代 -exec
文件数量很多时,-exec 会逐个启动命令,性能一般。xargs 会攒够一批再一次性传进去
find . -name "*.log" | xargs ls -lh
find /var/log -name "*.gz" | xargs -n3 rm
处理文件名可能带空格的文件,用 -print0 配 xargs -0:
find . -name "*.txt" -print0 | xargs -0 grep -l "keyword"
排除某些目录
find . -path "./node_modules" -prune -o -name "*.js" -print
在代码目录里找文件而想跳过 node_modules / .git,这个 prune 写法很常用,能省掉大量遍历开销。
限定遍历深度
find . -maxdepth 2 -name "*.conf"
find . -mindepth 1 -maxdepth 1
容易踩的坑
- 搜根目录记得加 sudo。普通用户权限不够,
/proc、/root 等目录下的文件会报一堆 Permission denied。
- 建议用绝对路径。从
/、/home 这类明确位置开始找,能避免相对路径搞错导致漏查或误查。
- 通配符一定加引号。
-name *.txt 会被 shell 本地展开,语义就变了。
- 删文件前先查一遍。删除类命令(
-exec rm)是不可逆的,先看清单再动手。
- 注意
-delete 的隐式深度优先。用 find -delete 时目录会被先清空再删,配合 -depth 才安全。
find 与其他查找命令的分工
locate:靠索引库查,速度最快,但结果是"上次索引"的快照,而且需要先 updatedb。
grep:按文本内容搜,find 管的是"文件名/属性",两者常组合成 grep -r 或 find | xargs grep。
which:在 PATH 里定位可执行文件路径。
whereis:找二进制文件、源码、man 手册的位置。
ls:列出当前目录内容,不做递归筛选。
一句话总结:按文件名和属性找东西用 find,按内容找东西用 grep 或 locate,找命令在哪用 which。
小结
find 的核心结构就是"路径 + 条件 + 动作":用 -name -type -size -mtime 等条件圈定范围,用 -print 默认输出,用 -exec/xargs 接后续动作。掌握通配引号、+/- 时间符号、{} + \; 转义这三点,实战基本就够用了。
(本文由 qidao123.com企服评测-应用市场 编辑提示整理:命令基于 GNU findutils,适用于 Ubuntu / Debian / CentOS / RHEL 等主流发行版,示例路径请按实际环境替换。) |