我想列出大小超过 10MB 的目录。我尝试使用find
命令执行相同操作,但find
命令未给出大小和类型选项的结果。它适用于任何类型或大小选项。
我尝试了以下命令:
find /opt -type d
- 在职的du -sh /opt/test
- 20MBfind /opt -size +10M
- 上市/opt/test/file1
find /opt -type f -size +10M
- 上市/opt/test/file1
find /opt -type d -size +10M
- 此命令未显示任何输出。
find
命令无法与-type d
和-size
选项一起使用。有人能建议我一个解决方案来满足我的要求吗?
答案1
目录也是文件,它有自己的大小,而不是其中文件的总大小。当你能够像读取常规文件一样读取目录时,这更有意义,但现在这不太常见。
如果您stat
在目录上运行,那么您将看到我所说的大小。这并不是说find
命令不能与选项一起使用-type d
。-size
它确实有效,只是测试的大小-size
不是您想要的。
另一方面du
是特意设计来计算分配给目录中所有文件的空间总和:
分配给目录类型文件的文件空间大小应定义为分配给以目录为根的文件层次结构中所有文件的空间总和加上分配给目录本身的空间。
(来源)
du
要查找返回足够大的数字的所有目录,您可以构建一个自定义测试,find
该测试将实际运行du
并解析其输出:
find . -type d -exec sh -c '
result="$(du -sk "$1" | tr "\t" " ")"
result="${result%% *}"
[ "$result" -gt 10240 ]
' find-sh {} \; -print
笔记:
- POSIX 要求
du
用一个空格字符分隔数字和路径名。du
我的 Debian 10 中的 GNU 仍然使用制表符(即使POSIXLY_CORRECT
设置了)。这就是我过去tr
将制表符转换为空格的原因。 打印的路径名中的制表符(如果有)du
也会被转换,但这并不重要,因为无论如何这部分行都会被丢弃。 - POSIX
du
without-k
使用 512 字节单位。实现可能使用不同的默认值和各种选项/方法来指定单位。明确规定-k
似乎是正确的;此选项是 POSIX 所要求的,它应该得到广泛支持并且明确无误。 find-sh
解释如下:sh
中的第二个是什么sh -c 'some shell code' sh
?- 代码可能不是最优的。我主要关心的是让它可移植。
- 这
-exec
是一个测试。您可以在 之前(或代替 )添加更多测试和/或操作-print
。
如果你需要的是知道大目录(而不是以某种自动化方式进一步解析信息,或执行额外的测试),那么这可能就足够了:
du -k . | sort -n
接下来,您需要手动过滤结果(与阈值进行比较)并挑选零个或多个最后条目。包含换行符的路径名将出现错误,但偶尔出现的换行符可能不会影响整个结果,特别是如果您仔细检查而不是机械地检查它。
您du
可能支持-t
/--threshold
选项,它可以为您进行过滤;但该选项不可移植。
如果以交互方式使用ncdu
。