shell 使用find标识超过X MB的目录

chhkpiq4  于 2023-03-03  发布在  Shell
关注(0)|答案(4)|浏览(127)

因此,我一直在尝试解决一个大学练习题,该练习题要求创建一个脚本来标识大小大于给定维度的目录。
我想用find来完成这个任务,使用下面的命令:

find -type d -size +100M

这似乎不工作,但如果我尝试使用它与type f它识别的文件,符合标准,但它似乎不工作的目录。
有没有一种方法可以使用find来完成这个任务?如果没有,最简单的识别这些目录的方法是什么?

wwodge7n

wwodge7n1#

作为GNU coreutils 的一部分,使用du命令来汇总目录(当前级别)的设备使用情况(空间),并使用阈值参数-t来排除小于100M的条目:

du -sh -t 100M ./*
new9mtju

new9mtju2#

从操作系统和find的Angular 来看,目录的“大小”只是包含该目录的 direct 子目录的所有 * name * 的文本文件的大小。要计算存储所有这些子目录、它们的子目录等所需的大小,操作系统必须递归地迭代所有子目录,并将它们的大小相加。这就是du -s对单个目录所做的。
您可以使用find或其他程序为树中的每个目录执行du(例如as done by Gilles),但这样做速度很慢,并且会反复计算相同大小的子子目录。
如果你需要这个列表只供人类查看,可能有一个更容易、更快、甚至更漂亮的解决方案:
tree * 打印文件树,并可以用磁盘大小注解每个条目。

├── [ 26K]  thisIsADirectory
│   ├── [  28]  someFile
│   ├── [1.0K]  thisIsAnotherDir
│   │   └── [ 512]  anotherFile
│   ├── [1.3K]  file1
│   ├── [1.0K]  file2
└── [ 514]  thisIsAlsoADir
    └── [   2]  someFile

tree-d选项只列出目录,而使用grep,您可以轻松地过滤掉100MB或更大的目录:

tree --du -h -d | grep -E ' \[ *[0-9]{3,}([.0-9]*)?M\] '
  • tree可能有不同的实现,可能支持也可能不支持这里使用的特性。我只知道一个实现,Steve Baker等人的那个。因此我认为它应该是相当可移植的。
8i9zcol2

8i9zcol23#

假设:

  • "目录的大小"包括所有子目录(即,您不限于计数 * 只是 * 目录中的文件),所以...
  • 如果"子"目录满足阈值,则"父"目录也将满足阈值

一个du/awk的想法,定位目录的大小是100M以上:

du -m . | awk '$1>=100'
ykejflvf

ykejflvf4#

也许是这个!

shopt -s globstar # enable recursion
du -s /var/**/*/ | awk '($1 > (1024*10O))'

相关问题