如何用find命令识别超指定大小的目录?或求简易替代方案
问题解答
为什么find -type d -size +100M不生效?
find的-size参数统计的是目录本身的元数据大小——也就是存储目录条目(文件名、inode指针等)的磁盘空间,而非目录下所有文件和子目录的总占用量。哪怕目录里有几十GB的内容,目录本身的大小通常也只有几KB,所以这条命令几乎找不到符合条件的目录。
能不能用find实现需求?
可以,但需要结合du(专门统计目录总大小的工具)计算目录实际占用空间后再过滤。示例命令:
# 递归查找所有目录,统计总大小并过滤超过100M的目录(字节单位) find . -type d -exec du -sb {} + | awk '$1 > 104857600'
-sb:让du以字节为单位输出目录总大小(100M = 10010241024 = 104857600字节)-exec ... +:让find一次性将多个目录传给du,比-exec ... ;更高效awk:过滤出字节数超过100M的条目
如果需要人类可读的输出,可调整为:
find . -type d -exec du -sh {} + | awk '$1 ~ /^[0-9]+[G]/ || ($1 ~ /^[0-9]+[M]/ && substr($1,1,length($1)-1) > 100)'
这条命令会匹配大小超过100M或≥1G的目录,输出带单位的大小和路径。
识别大目录的最简单方法
直接用du命令即可,无需find,这是最直接高效的方式:
方法1:用--threshold过滤(GNU coreutils 8.21+支持)
# 递归显示所有总大小超过100M的目录(人类可读格式) du -h --threshold=100M /path/to/target
如果只想显示一级子目录的大小(不深入子目录),加上-d 1参数:
du -d 1 -h --threshold=100M /path/to/target
方法2:兼容旧版本系统的写法
如果你的du不支持--threshold,可以用awk配合:
# 以字节为单位统计并过滤,仅输出目录路径 du -sb /path/to/target/* | awk '$1 > 104857600 {print $2}' # 或者以人类可读格式输出 du -sh /path/to/target/* | awk '$1 ~ /^[0-9]+[G]/ || ($1 ~ /^[0-9]+[M]/ && substr($1,1,length($1)-1) > 100)'
内容的提问来源于stack exchange,提问作者Gonçalo Costa
相关产品推荐
相关产品推荐

