-size 0最可靠,因它直接匹配文件st_size为0字节的严格定义;-empty仅适用于目录,对文件无效;配合-type f可排除目录、设备文件等干扰,确保结果仅为真正空的普通文件。

直接用 find . -type f -size 0 就能准确找出所有 0 字节空文件,不需要额外判断或过滤。
为什么 -size 0 是最可靠的方式
Linux 中“空文件”严格定义为文件大小(st_size)为 0 字节的普通文件。这和是否可读、是否有内容逻辑无关,只看 stat() 返回的字节数。-size 0 正是直接匹配这个字段,不依赖文件名、权限或时间戳。
-
-empty不能用于文件——它只对目录有效,对文件无效且无意义 -
-size 0c和-size 0等价,c可省略;但别写成-size 0k,那会匹配磁盘占用为 0KB 的文件(几乎不存在) - 符号链接、设备文件、管道等非普通文件默认被
-type f排除,避免误报
常见错误:路径没加 -type f 导致结果混乱
漏掉 -type f 时,find 会把目录、套接字、甚至某些特殊文件也纳入匹配范围,而它们的 st_size 可能为 0(如某些 procfs 条目),造成干扰。
- 错误写法:
find /tmp -size 0→ 可能列出/tmp/.X11-unix这类伪空目录(实际是 socket 目录) - 正确写法:
find /tmp -type f -size 0→ 只返回真正大小为 0 的普通文件 - 如果想排除特定路径(如
/proc、/sys),加-xdev或用2>/dev/null屏蔽权限错误
批量处理时注意 shell 特殊字符和路径安全
查出空文件后常需删除或归档,但直接管道给 xargs rm 在含空格、换行符的路径下会出错。
- 安全删除推荐:
find /path -type f -size 0 -delete(GNU find 支持,原子操作) - 兼容性写法(尤其 BusyBox):
find /path -type f -size 0 -exec rm -f {} \; - 千万别用:
find /path -type f -size 0 | xargs rm—— 遇到file name with space.txt会被拆成两个参数,rm 失败甚至误删
真正的难点不在“找”,而在确认哪些空文件该留、哪些该删。比如 .keep、.env.example、日志轮转残留的 app.log,它们都是 0 字节,但语义完全不同。执行前务必先 find ... -ls 或 -print 看一眼路径和上下文。


















