用 find 入门:按条件快速定位文件
在终端里找文件,很多人第一反应是 ls 翻目录,或者凭记忆猜路径。目录一深、文件一多,这两种办法都慢。find 就是按条件搜文件的工具:告诉它从哪开始、按什么条件筛,它把符合的文件一个个列出来。
最基本的用法是 `find 目录 -name "文件名"`。比如在当前目录找所有以 .log 结尾的文件:`find . -name "*.log"`。注意引号不能省:不加引号,shell 会先把 `*.log` 展开成当前目录的文件名,find 拿到的就不是你想要的模式了。
只知道文件名的一部分也没关系,`-name` 支持通配符:`find . -name "*report*"` 能找出名字里带 report 的所有文件。区分大小写有时很烦人,`-iname` 可以忽略大小写:`find . -iname "*.PDF"`,PDF、pdf 一次全找出来。
按类型筛也很常用。`-type f` 只要普通文件,`-type d` 只要目录:`find . -type d -name "node_modules"` 能快速定位散落在各处的依赖目录;`find . -type f -name "*.tmp"` 则只列临时文件,不会被目录名干扰。
时间是最实用的筛选条件之一。`-mtime -7` 表示 7 天内改过的文件,`-mtime +30` 是 30 天前改过的:`find . -type f -mtime -1` 列出今天动过的文件,排查"刚才谁改了配置"时特别顺手。`-mmin -60` 更精细,按分钟算,适合刚出问题那一小时的定位。
文件大小也能筛:`-size +100M` 找出大于 100MB 的文件,`-size -10k` 找出小于 10KB 的:`find . -type f -size +100M` 是清理磁盘前的第一步,先看大文件都在哪,再决定删什么。
找到之后常常还要接着处理,这时 `-exec` 派上用场:`find . -name "*.log" -exec ls -lh {} \;` 对每个结果执行 ls -lh;`find . -name "*.bak" -exec rm {} \;` 批量删除备份文件。`{}` 代表找到的文件,`\;` 表示命令结束。删除类操作先别急着执行,可以先用 `-print` 看一遍结果,确认无误再换 `-exec rm`,避免误删。
find 默认递归搜索整个子树,目录层级太深会很慢。用 `-maxdepth 2` 限制只搜两层:`find . -maxdepth 2 -name "*.conf"`,既快又不会漏掉常见的配置位置。反过来,`-mindepth 1` 可以排除起始目录本身。
最后提醒两点:一是 find 的条件可以组合,多个条件默认是"与"的关系,`-o` 表示"或",组合前先想清楚逻辑;二是在根目录或超大目录上直接跑 find 会很慢,先缩小起始目录,再放宽条件。
从今天开始,找文件先想到 find:一个起点、一个条件,多数"文件在哪"的问题一条命令就能收束。把它和 grep 搭配起来用——find 定位文件,grep 定位文件里的内容——终端排查的效率会再上一个台阶。
- 点赞
- 收藏
- 关注作者
评论(0)