马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在 Linux 下想按「模糊条件」找文件,常见需求有三类:按名字片段找、按当前目录找、按文件内容找。命令行里对应的工具是 find、ls 加 grep、locate,以及 find 串 xargs 再串 grep 的内容检索组合。本文把这几种方式按适用场景拆开讲,并给出各自的坑,供日常运维和脚本编写时挑最合适的用。
用 find 做递归模糊查找
find 是 Linux 里最完整的搜索工具,可以基于文件名、类型、大小、修改时间等条件查。做模糊查找主要靠通配符,* 匹配任意长度字符,? 匹配单个字符,方括号匹配指定范围里的一个字符。
- 查当前目录及子目录下所有以 .txt 结尾的文件:find . -name "*.txt"
- 查名称里带 document 的所有文件:find . -name "*document*"
- 忽略大小写:find . -iname "*readme*"(日常搜 README、readme 混用两种写法时很有用)
find 默认从你给的路径开始递归,点号代表当前目录。注意默认的 -name 是区分大小写的,搜不到时先想想是不是该换 -iname。
find . -name "*.txt"
find . -name "*document*"
find . -iname "*readme*"
find 的其他常用条件
实际排障时,光按名字找往往不够,后面还要叠类型、大小、时间条件。
find /var -type f -size +100M
find /home -type d -empty
find / -name "*.log" -mtime +7
find . -type f -perm 777
依次是:找大于 100M 的文件、找空目录、找 7 天前的日志 、找权限为 777 的文件。-type f 表示普通文件,d 是目录,l 是软链接;-mtime 按天算,+7 是七天前更早的。这几个条件叠起来,就是磁盘清理和安全巡检的基本组合。
只查当前目录:ls 配合 grep
如果你只想在当前目录里模糊找,不进子目录,把 ls 的输出接给 grep 是最短的写法。
ls | grep "report"
直观归直观,它有两个限制:一是只看当前层,不会递归;二是遇到文件名里有空格、中文或换行时,ls 的输出会被拆成多行,管道里就会出现假匹配。所以脚本里更推荐 find 加 -maxdepth 1,输出稳定可解析。
find . -maxdepth 1 -name "*report*"
find . -maxdepth 1 -name "doc*"
-maxdepth 1 表示只搜当前这一层,不往下钻。这个写法既保留了 find 的稳定输出,又把递归关掉了,是脚本里替代 ls 管道的首选。
用 locate 做极速查找
locate 走的是预先构建好的文件索引库,速度比 find 快一个量级,适合全盘按名字搜索。
locate config
updatedb
用法就两步:先 updatedb 建库或更新库,再 locate 关键字。代价是它反映的不是实时状态——新建的文件没更新库之前 locate 搜不到,刚删的文件可能还搜得出来。在后台跑着定时 updatedb 的机器上用没问题,对实时性要求高的场景还是得回到 find。
在文件内容里模糊搜:find + xargs + grep
前面几种都是找「文件名字」,如果要在找到的文件内部继续搜内容,就把 find、xargs 和 grep 串起来。
find . -name "*.log" | xargs grep "error"
find 先挑出所有 .log,xargs 把这份列表切成参数交给 grep,grep 逐个文件搜 error 并打印所在行。想看文件名和行号就补上 -H 和 -n;只想看哪些文件里有,加 -l。
find . -name "*.log" | xargs grep -n "error"
find /etc -name "*.conf" | xargs grep -l "keepalive"
注意 xargs 默认按空格切参数,文件名里有空格时会出错,稳妥写法是 find 输出以 NUL 分隔再让 xargs -0 接收,或者直接用 grep -r 递归代替这一串。
在真实目录里搜内容:直接上 grep -r
既然 grep 自己就能递归,上面的 xargs 链路在多数场景下其实是多余的。
grep -r "error" . --include="*.log"
grep -rn "timeout" /etc/nginx/
grep -r 加 --include 收窄文件类型,比 find 加 xargs 再 grep 少写一半命令,而且处理空格文件名更省心。能用 grep -r 解决的,就不必搭三件套。
图形界面里的搜索
如果你用的是带桌面的发行版,GNOME 的「文件」(Nautilus)和 KDE 的 Dolphin 都内置搜索栏,输入关键字即做模糊匹配,还支持按类型、时间、大小过滤。对不熟命令行的用户来说这是最直观的路径,缺点是慢、且默认不搜挂载的外部盘。
shell 通配符与 Tab 补全
交互式敲命令时,通配符本身就能用:敲 echo *doc* 或 ls *report* 会直接在当前目录展开匹配项。文件名记得一半时可以按 Tab 补全,按两下列出所有候选。这两种方式只在当前目录生效,和脚本里的 find 不是一回事,别混淆。
怎么选
给个粗暴的对照:只查当前这一层、临时看一眼,用 ls | grep 或通配符最快;要递归按名字找、还要叠类型和大小条件,用 find;全盘搜名字且不要求实时,用 locate;搜文件内容,优先 grep -r,只有需要先按类型筛一遍再进内容时再上 find 配 xargs;桌面环境里不熟命令,就用文件管理器的搜索框。
总体思路是:范围小、要求直观就走简单管道;要可控、要写进脚本,就落到 find 的参数上。
qidao123.com企服评测-应用市场 编辑提示:本文为 Linux 文件检索方法的实操归纳,命令均可在普通用户终端复现,涉及全盘搜索时请注意过滤系统目录以免影响性能。 |