做什么

实时遍历文件系统查找——最强但稍慢的查找工具。

常用条件

条件 含义
-name "pattern" 文件名(区分大小写)
-iname "pattern" 文件名(忽略大小写)
-type f / d / l 文件 / 目录 / 链接
-size +100M 大于 100M
-size -1k 小于 1k
-mtime -7 7 天内修改
-mtime +30 30 天前修改
-mmin -60 60 分钟内修改
-user wadely 属主
-perm 644 权限精确等于
-perm -u+x 权限至少
-empty 空文件 / 目录
-newer ref 比 ref 新
-maxdepth N 限制深度

常用动作

动作 含义
-print 打印(默认)
-delete 删除
-exec cmd {} \; 对每个结果执行命令
-exec cmd {} + 批量执行(更快)
-ls 详细列表

实战

# 按名字
find /etc -name "*.conf"
find . -iname "*.PNG"                # 忽略大小写

# 按时间
find /var/log -name "*.log" -mtime -1      # 1 天内
find /tmp -mmin -30                          # 30 分钟内
find /backup -mtime +90 -delete              # 删 90 天前

# 按大小
find / -size +1G                              # 大于 1G
find . -size +100M -size -1G                  # 100M-1G

# 组合
find /home -type f -name "*.tmp" -mtime +7 -delete
find . -type d -name "node_modules" -prune -o -name "*.js" -print
#         ↑                          ↑
#         不进入 node_modules         其他 .js 输出

# 对每个结果执行
find . -name "*.txt" -exec gzip {} \;
find . -name "*.log" -exec rm -f {} +         # 批量更快

  • -exec ... \; 每个文件 fork 一次(慢);-exec ... + 批量(快)
  • 含空格 / 特殊字符的文件名安全姿势:find ... -print0 | xargs -0 cmd
  • -prune 用于"跳过整个子树"——配 -o
  • locate 准(实时),但比 locate 慢得多

现代替代:fd

sudo apt install fd-find       # Ubuntu 命令是 fdfind
fd "\.log$" /var

fd 是 Rust 写的现代版 find——快、易用、默认忽略 .gitignore。