find /data -maxdepth 6 -xdev -type f -name '*.jpg' | wc -l
find /data -type l -exec readlink -f {} \; | sort | uniq -d

清理脚本用 find /data -type f 扫附件目录,跑了四十分钟还在出结果,du 的统计值越滚越大。ls 一看 uploads/current 指向 uploads 自己,多了一层回环。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,默认的 find 不跟随符号链接,但脚本里加了 -L,跟随之后 current 又回到上一级,路径深度无限增长。每一层都是真实存在的目录项,遍历器不会自己判重。

「软链接循环遍历」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:去掉 -L 保持不跟随 需要看目标就单独处理;必须跟随时加 -maxdepth 限制层数;用 find -xdev 把范围锁在同一个文件系统内;写脚本前先用 readlink -f 把可疑链接列出来。

改完只确认一件事:同样的目录扫描 20 秒内结束 输出的文件数和 du 统计的条目数一致。

作者 9823189