「按名字找文件」用 find/fd/locate,「按内容找文本」用 grep,「看目录结构」用 tree。理解它们的实时遍历 vs 索引查询差异,能少走很多弯路。

fd

fd - find 的现代替代品,语法简洁、默认智能过滤、速度快(Rust 实现)

常用命令

  • fd config 在当前目录递归查找文件名含 config 的文件(模式默认是正则,且默认忽略 .gitignore 和隐藏文件)
  • fd '\.log$' 用正则匹配以 .log 结尾的文件
  • fd -e md 按扩展名查找,等价于 find 的 -name "*.md" 但更顺手
  • fd -t d node 只找目录(-t f 文件、-t l 符号链接、-t x 可执行文件)
  • fd -H -I pattern-H 包含隐藏文件,-I 不忽略 .gitignore(两个都加约等于裸 find)
  • fd -e log -x rm {} 对每个结果并行执行命令;-X 把所有结果拼成一条命令执行
  • fd -e jpg -x convert {} {.}.png{} 完整路径、{.} 去扩展名、{/} 文件名、{//} 父目录
  • fd --changed-within 1d 找 1 天内改动过的文件(也支持 2h30min2026-07-01
  • fd -S +100m 找大于 100M 的文件(-100k 为小于 100k)
  • fd -d 2 -t d 限制递归深度为 2 层
  • fd -E node_modules -E '*.min.js' TODO-E 追加排除模式
  • fd -g '*.test.ts' 用 glob 通配符而非正则匹配

语法格式

fd [OPTIONS] [pattern] [path...]

OPTIONS

  • -e ext 按扩展名过滤(可多次指定)
  • -t f|d|l|x|e 按类型过滤:文件/目录/链接/可执行/空文件
  • -H 包含隐藏文件;-I(或 -u)忽略 ignore 规则,-uu 等于 -H -I 全都搜
  • -E pattern 排除匹配的文件/目录
  • -d n 最大递归深度
  • -x cmd 对每个结果并行执行命令;-X cmd 批量执行一次
  • -S [+-]size 按大小过滤
  • --changed-within / --changed-before 按修改时间过滤
  • -g 使用 glob 模式;-F 按字面字符串匹配(不解释正则)
  • -p 让 pattern 匹配完整路径而不仅是文件名
  • -0 NUL 分隔输出,配合 xargs -0

备注

  • 安装:macOS brew install fd;Debian/Ubuntu 包名为 fd-find,可执行文件叫 fdfind,一般 alias fd=fdfind
  • 默认忽略隐藏文件和 .gitignore 内容是最常见的「怎么搜不到」原因——搜不到先加 -HI 试试
  • pattern 是智能大小写:全小写时忽略大小写,含大写字母时精确匹配;结果默认彩色输出

find

find - 按名称、类型、时间、大小等条件在目录树中实时查找文件并可对结果执行操作

常用命令

  • find . -name "*.log" 在当前目录递归查找所有 .log 文件(-iname 忽略大小写)
  • find /etc -type f -name "nginx.conf" 只找普通文件;-type d 找目录,-type l 找符号链接
  • find . -type f -mtime -7 找 7 天内修改过的文件;-mtime +30 为 30 天前修改的
  • find . -type f -mmin -60 找 60 分钟内修改过的文件(排查刚发生的问题很常用)
  • find / -type f -size +100M 找大于 100M 的文件(-size -1k 小于 1k;单位 c/k/M/G)
  • find /var/log -name "*.log" -mtime +30 -delete 删除 30 天前的日志(先去掉 -delete 预览一遍再执行)
  • find . -name "*.sh" -exec chmod +x {} \; 对每个结果执行命令,{} 是占位符
  • find . -type f -name "*.tmp" -exec rm -f {} ++ 结尾把多个结果拼成一次命令执行,比 \;
  • find . -type f -name "*.java" | xargs grep -l "TODO" 结合 xargs 二次过滤(路径含空格时用 -print0 | xargs -0
  • find . -maxdepth 1 -type d 只看当前层的目录,不往下递归
  • find . -type f -newer build.log 找比某文件更新的文件
  • find . -type f -user root -perm -4000 按属主 + 权限位查找(如 setuid 文件)

语法格式

find [path...] [expression]

expression 由测试条件(-name、-type…)、操作(-print、-exec…)和逻辑运算符(-a 与、-o 或、! 非)组成,条件间默认是「与」。

OPTIONS

  • -name pattern 按文件名通配符匹配(-iname 忽略大小写)
  • -type f|d|l 按类型过滤:普通文件 / 目录 / 符号链接
  • -mtime [+-]n 按修改时间(天);-mmin 按分钟;-atime/-ctime 访问/状态变更时间
  • -size [+-]n[ckMG] 按大小过滤
  • -maxdepth n / -mindepth n 限制递归深度
  • -exec cmd {} \; 逐个执行命令;-exec cmd {} + 批量执行
  • -delete 直接删除匹配结果(危险,务必先预览)
  • -print0 以 NUL 分隔输出,配合 xargs -0 处理含空格文件名
  • -path pattern -prune 跳过整棵子树,如 find . -path ./node_modules -prune -o -name "*.js" -print
  • -empty 匹配空文件或空目录

备注

  • -mtime +7 是「7 天以前」,-mtime -7 是「7 天以内」,不带符号是「恰好第 7 天」,最容易记反
  • -prune 排除目录时,后面必须接 -o ... -print,否则被剪掉的目录名本身也会打印出来
  • macOS/BSD find 语法基本兼容,但 find 不写路径时 GNU 默认当前目录、BSD 会报错,稳妥起见永远写上 .;日常交互式查找可用更快更简洁的 fd 替代

grep

grep - 按正则表达式在文件或标准输入中搜索匹配的行

常用命令

  • grep "error" app.log 在文件中搜索包含 error 的行
  • grep -i "error" app.log 忽略大小写匹配
  • grep -rn "TODO" src/ 递归搜索目录并显示文件名和行号(排查代码最常用)
  • grep -v "DEBUG" app.log 反向匹配,输出不含 DEBUG 的行(常用于过滤噪音)
  • grep -E "ERROR|WARN" app.log 扩展正则,匹配多个关键词之一(等价旧写法 egrep)
  • grep -o 'trace_id=[0-9a-f]*' app.log 只输出匹配到的片段本身而非整行,适合提取字段
  • grep -C 3 "Exception" app.log 显示匹配行上下各 3 行上下文(-B 只看前、-A 只看后)
  • grep -l "main" *.c 只列出含匹配的文件名(-L 列不含匹配的文件)
  • grep -c "GET /api" access.log 统计匹配行数
  • grep -w "port" nginx.conf 全词匹配,避免命中 export、report 等
  • ps aux | grep -F "[java]"-F 按字面字符串匹配,不解释正则元字符
  • grep -rn --include='*.py' "import requests" . 递归时只搜指定类型的文件(--exclude-dir=.git 排除目录)

语法格式

grep [OPTIONS] PATTERN [FILE...]

不指定 FILE 时从标准输入读取,因此常接在管道后面使用。

OPTIONS

  • -r / -R 递归搜索目录(-R 会跟随符号链接)
  • -i 忽略大小写
  • -v 反向匹配(输出不匹配的行)
  • -n 显示行号
  • -E 扩展正则(支持 |+?{} 不加反斜杠);-P Perl 正则(GNU 版支持 \d、断言等)
  • -o 只输出匹配的部分,每个匹配一行
  • -A n / -B n / -C n 显示匹配行之后 / 之前 / 前后 n 行上下文
  • -l / -L 只列出(不)含匹配的文件名
  • -c 统计每个文件的匹配行数
  • -w 全词匹配;-x 整行匹配
  • -F 按固定字符串匹配(不解释正则)
  • --include / --exclude / --exclude-dir 递归时按通配符筛选文件或排除目录

备注

  • macOS 自带 BSD grep:不支持 -P(Perl 正则),且 -r 细节略有差异;需要 GNU 行为可 brew install grep 后用 ggrep
  • 大代码仓库里交互式搜索建议用 ripgrep(rg):默认递归、自动忽略 .gitignore 和二进制文件、速度远快于 grep,常用参数(-i/-v/-o/-C/-l)与 grep 基本一致
  • 搜索 - 开头的内容会被当成选项,需写成 grep -- "-foo" filegrep -e "-foo" file

locate

locate - 基于预建数据库按文件名瞬间查找文件(快但可能不是最新)

常用命令

  • locate nginx.conf 在整个文件系统数据库中查找路径含 nginx.conf 的条目
  • locate -i readme 忽略大小写查找
  • locate -b '\nginx.conf' 只匹配文件名本身(basename),\ 前缀表示精确名而非子串
  • locate -c '*.log' 只统计匹配数量,不列路径
  • locate -e '*.pid' 只输出当前真实存在的文件(剔除数据库里已被删除的陈旧条目)
  • locate -r '/etc/.*\.conf$' 用正则匹配完整路径
  • locate -l 20 '*.mp4' 只显示前 20 条结果
  • sudo updatedb 手动重建数据库(新建的文件立刻可被 locate 找到)
  • locate -S 查看数据库统计信息(条目数、更新时间等,plocate/mlocate 支持)

语法格式

locate [OPTIONS] pattern...

pattern 不含通配符时按「子串」匹配路径;含 *? 等通配符时按 glob 匹配整个路径。

OPTIONS

  • -i 忽略大小写
  • -b 只匹配文件名部分,不匹配目录路径
  • -c 只输出匹配条目数
  • -e 只输出实际仍存在的文件
  • -r regexp 使用基本正则匹配(--regex 为扩展正则)
  • -l N 限制输出条数
  • -0 以 NUL 分隔输出,配合 xargs -0
  • -A 多个 pattern 时要求全部匹配(默认任一匹配即输出)

备注

  • 数据库靠 cron/systemd timer 定期跑 updatedb(通常每天一次),刚创建/删除的文件查不到或有幽灵条目是正常现象,急用先 sudo updatedb
  • 现代发行版多用 plocate(索引更小、查询更快)替代 mlocate,命令行为兼容;权限上只返回当前用户有权访问的路径
  • macOS 自带的是 BSD locate,需先 sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist 启用数据库;日常在 macOS 上更推荐 mdfind -name xxx(Spotlight 实时索引)

tree

tree - 以树状结构递归列出目录内容

常用命令

  • tree 以树状图列出当前目录下所有文件和子目录
  • tree -L 2 只展开到第 2 层,快速看清目录骨架
  • tree -d 只显示目录,不列文件
  • tree -a 连同隐藏文件(以 . 开头)一起显示
  • tree -I 'node_modules|.git|dist' 排除匹配模式的目录/文件(多个模式用 | 分隔)
  • tree -P '*.md' 只列出匹配通配符的文件(常配合 --prune 去掉空目录)
  • tree -h 同时显示文件大小(人类可读单位,如 4.0K、1.2M)
  • tree --du -h 目录行显示该目录累计占用大小,类似 du
  • tree -f 显示每个条目的完整相对路径前缀
  • tree -t 按修改时间排序(配合 -r 反序,最新的在最后/最前)
  • tree -L 3 -o struct.txt 把结果输出到文件,便于贴进文档
  • tree -J / tree -X 以 JSON / XML 格式输出,便于程序解析

语法格式

tree [OPTIONS] [directory ...]

OPTIONS

  • -L level 限制递归显示的目录深度
  • -d 只列目录
  • -a 显示隐藏文件
  • -I pattern 排除匹配 pattern 的条目(| 分隔多个)
  • -P pattern 只显示匹配 pattern 的文件
  • --prune 修剪掉不含匹配文件的空目录(配合 -P
  • -h / -s 人类可读大小 / 字节数
  • -f 显示完整路径前缀
  • -C 强制彩色输出(管道/重定向时默认关闭)
  • --gitignore 遵循 .gitignore 规则过滤(1.9+ 版本支持)
  • -o filename 输出到指定文件

备注

  • macOS 不自带 tree,需 brew install tree;Linux 发行版一般也要手动安装(apt/yum install tree
  • 大目录直接 tree 输出会刷屏,习惯先加 -L 2-I 排除 node_modules.git
  • 中文/特殊字符显示为转义时,可加 -N 原样输出,或确认终端 locale 为 UTF-8