做什么
实时遍历文件系统查找——最强但稍慢的查找工具。
常用条件
| 条件 | 含义 |
|---|---|
-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。