linux下按大小查找大文件最直接方式是用find配合-size参数,+100m表示严格大于100mb,100m表示精确匹配;需结合-type f、-ls、-mtime等限定条件,并优先预览再删除,避免误删关键文件。

按大小查找大文件并确认路径
Linux下最直接的方式是用 find 配合 -size 参数,但要注意单位和边界行为:+100M 表示「严格大于100MB」,而 100M 是「等于100MB」,不加符号默认是「精确匹配」,几乎找不到——因为文件大小极少刚好整百MB。
常用组合:
-
find /var/log -type f -size +100M:查 /var/log 下所有大于100MB的普通文件 -
find /home -type f -size +2G -ls:加-ls可同时显示权限、所有者、修改时间,比单纯输出路径更利于判断是否可删 - 避免用
-size +100000000c这类字节数写法——易数错零,且不可读
安全删除前先预览或限制数量
直接 -delete 风险极高,尤其在根目录或挂载点下误操作会导致服务中断。必须先确认结果集合理,再执行删除。
推荐分两步操作:
- 先用
find ... -print | head -n 5看前5个匹配项,检查路径是否符合预期 - 确认无误后,改用
-exec rm -f {} \;(注意结尾的空格和反斜杠) - 若要批量删但防误删,可用
-ok rm -f {} \;,每删一个都交互确认 - 慎用
-delete:它不支持-maxdepth与-delete同时生效(某些旧版find会报错),且无法与-ls共存
排除正在被进程占用的文件
直接删掉还在被写入的日志或数据库文件,可能导致程序崩溃或数据损坏。可以用 lsof 辅助过滤,但更实用的是反向思路:优先删那些「很久没访问过」的旧文件。
例如:
-
find /tmp -type f -size +50M -mtime +7:删7天以上、大于50MB的临时文件(-mtime +7表示修改时间早于7*24小时) -
find /var/log -name "*.log" -size +100M -mtime +30:只处理老日志,避开最近活跃的 - 不要依赖
-atime(访问时间)——很多系统默认关闭atime更新,值不可靠
处理硬链接和符号链接的陷阱
find 默认会遍历符号链接指向的目标,可能跨分区或进入不该进的目录;而硬链接共享同一inode,删其中一个不影响其他硬链接,但 -size 判断仍有效。
关键控制点:
- 加
-xdev(或-mount)防止跨文件系统搜索,避免意外扫到 /proc、/sys 或 NFS 挂载点 - 加
-follow才会跟随符号链接,不加则只处理链接文件本身(此时-size返回的是链接文件大小,通常只有几十字节) - 用
find ... -printf "%i %p\n" | sort -n可快速发现重复inode,辅助识别硬链接簇
真正麻烦的不是命令怎么写,而是删完才发现某个“大文件”其实是数据库的 WAL 日志或容器的 overlay2 层——它们名字普通、大小超标,但删了就起不来服务。动手前最好 file 看类型、lsof -Rn +D /path 查占用、再翻一眼应用文档。











