find -size 是什么
find 的 -size 按文件长度筛选,可带单位(c 字节、k KiB、M MiB、G GiB),不带单位时以 512 字节块计。-size 的比较是块级的:内部先换算成块再向上取整,所以 -size 500M 表示「恰好向上取整等于 500MiB」,而清理大文件真正该用的是区间写法 -size +500M。配对选项 -empty 匹配长度为 0 的文件,也匹配不含任何条目的目录,是清理空目录的正确工具(-size 0 只对普通文件成立)。
基本信息
| 适用平台 | Linux/BSD/macOS(GNU findutils 与 BSD find 的 -size 语法一致) |
|---|---|
| 命令语法 | find 路径 -size [+|-]N[ckMGb] ;或 find 路径 -empty |
| 单位含义 | 默认 512 字节块;c 字节 k KiB M MiB G GiB b 512 字节块 |
| 组合要点 | -type f 限定普通文件、-name 过滤后缀、-printf/-exec 处理结果、-delete 作为最后动作 |
| 权限说明 | 遍历需要目录的读与执行权限,跨用户目录加 sudo;-delete 同样受权限约束 |
典型使用场景
- 磁盘清理:定位大于 500M 的日志、备份、临时包,作为扩容或清理的依据
- 残留清理:找 0 字节的上传中断文件与空目录,避免同步与打包时带上垃圾
- 发布核查:检查站点目录里混入的超大媒体文件或误打包的数据库备份
- 容量归因:按大小阈值筛出候选文件,再交给 du/ls 复核实际占用
- 自动化巡检:find -size +1G 配合告警,及时发现在线业务目录的大文件堆积
常用示例
常用示例
find /data -type f -size +500M # 大于 500MiB 的文件
find /data -type f -size +1G -printf '%s %p\n' | sort -rn | head # 按大小排序(GNU)
find . -type f -size -10k -name '*.tmp' # 小于 10KiB 的临时文件
find /var/log -type f -size +100M -exec ls -lh {} + # 交给 ls 输出可读大小
find /var/tmp -type f -empty # 0 字节文件
find /srv -type d -empty # 不含任何条目的空目录
find /backup -type f -size +2G -delete # 慎用:直接删除写法与含义对照
| 写法 | 含义 | 注意 |
|---|---|---|
| -size 500M | 向上取整后恰好等于 500MiB | 几乎只匹配特定长度,日常很少这样写 |
| -size +500M | 大于 500MiB | 清理大文件的主用法 |
| -size -1M | 小于 1MiB | 0 字节文件也算在内,配合 -type f 更精确 |
| -empty | 普通文件长度为 0,或目录无条目 | 对符号链接不成立,符号链接长度是目标路径长度 |
| 省略单位 | 按 512 字节块比较 | 写 -size 1024 得到的是 512KiB 而不是 1KiB |
-size 判断的是文件长度,不是磁盘占用:稀疏文件、块对齐、压缩文件系统都会让 find -size 与 du 的结果不一致,容量排查建议两个都看。
GNU find 的 -printf '%s %p\n' 直接输出字节数与路径,比 -exec ls -lh {} + 少一次进程创建,百万级文件时差别明显;BSD/macOS 的 find 无 -printf,需退回 -exec。