一、基本结构
find 起始目录 条件 动作
不写动作时默认 -print(打印路径)。条件可以叠加,默认是「与」的关系。
find /var/log -name "*.log" -type f
二、按名称与类型
find . -name "*.conf" # 区分大小写
find . -iname "*.CONF" # 忽略大小写
find . -type f # 普通文件
find . -type d # 目录
find . -type l # 符号链接
-name 的通配符要加引号,否则会被 shell 先展开。-path 匹配整条路径,适合排除特定目录:
find . -path ./node_modules -prune -o -name "*.js" -print
-prune 表示「不进入这个目录」,-o 是「或」,末尾的 -print 不能省(-prune 分支会吃掉默认动作)。
三、按时间
find . -mtime -7 # 7 天内修改过
find . -mtime +30 # 30 天前修改过
find . -mmin -10 # 10 分钟内修改过
find . -newer ref.txt # 比 ref.txt 新
-mtime 按「天」算,-mmin 按「分钟」。- 是「之内」,+ 是「之前」,容易记反,建议先用 -ls 看一眼结果再执行删除。
四、按大小
find / -type f -size +100M # 大于 100MB
find . -size -1k # 小于 1KB
find . -size +1G -size -10G # 区间
单位:c 字节、k KB、M、G。注意 -size 是按块向上取整,-size 1k 包含 0–1024 字节的文件。
找大文件更直观的组合是:
du -ah /var | sort -rh | head -20
find 适合「按条件筛」,du 适合「看谁占空间」,两者配合用。
五、批量处理:-exec 与 xargs
# 对每个文件执行一次命令({} 是占位符,\; 是结束)
find . -name "*.log" -exec gzip {} \;
# 一次传多个文件(+ 结尾,效率高)
find . -name "*.log" -exec gzip {} +
# 用 xargs(文件名含空格时要用 -print0)
find . -name "*.tmp" -print0 | xargs -0 rm -f
三个要点:
\;每个文件启动一次进程,慢;+批量传参,快。- 文件名可能含空格、换行,必须
-print0+xargs -0,否则会被拆错。 - 删除前先
-print预览,确认无误再换成-delete或rm。
六、安全删除旧文件
# 先看
find /data/logs -type f -name "*.log" -mtime +30 -print
# 确认后再删
find /data/logs -type f -name "*.log" -mtime +30 -delete
生产环境建议先 -print | wc -l 看数量,再执行;重要目录先备份或用 -exec mv {} /tmp/trash/ \; 移到回收目录。
七、常见坑
- 忘了引号:
-name *.log被 shell 展开成当前目录的文件名,条件失效。 - 权限报错刷屏:加
2>/dev/null屏蔽Permission denied。 - 符号链接:默认不跟随,需要时用
-L。 -mtime的边界:-mtime +30是「超过 30 个 24 小时」,不是「第 31 天」。- 在
/下执行:可能扫到/proc、/sys,加上-xdev限制在同一文件系统。
小结
find 目录 条件 动作;-name 加引号,-mtime +30 是 30 天前,-size +100M 找大文件;批量处理用 -exec {} + 或 -print0 | xargs -0;删除前一定先 -print 预览。