我正在寻找一种工具,可以提供某些文件夹和文件在磁盘上的总大小。它应该能够根据按顺序处理的多个过滤器模式明确包含或排除项目及其所有子项(其中的文件夹和文件)。
例如,过滤器模式应该能够:
- 匹配 /bar (及其所有子项)而不匹配 /foo/bar
- 仅包含 /foo (及其所有子项),而不必排除 /bar 和 /baz
- 在无限数量的级别上工作。例如,排除/foo 中的.jpg 应排除/foo/cat.jpg 和/foo/bar/dog.jpg。
我尝试这样做,du
但我无法完成上述所有操作。
答案1
听起来你想要一个工具
- 根据文件路径上的模式选择文件
- 检索并总结它们的大小和/或磁盘使用情况
然后,存在一个问题:如果某些文件路径引用同一个文件(硬链接在一起)该怎么办。由于它们是同一个文件,您只想计算一次它们的大小吗?
要查找文件,主要选项是:
find
:一个标准命令,尽管有许多不同的实现以及彼此不同的标准扩展。- shell 通配符。 POSIX 再次指定了该实用程序的通配符
sh
,但这非常有限,并且一些 shell 对此进行了扩展。尽管这里可能只有zsh
's 具有您需要的功能。
要获取大小和/或磁盘使用情况,选项有:
du
但不幸的是,对于类型的文件目录,它不能只提供该文件的磁盘使用情况。- GNU 实现
find
有一个-printf
预测,可以告诉它打印磁盘使用情况或大小 stat
可以做到这一点的实用程序的各种不兼容的实现。有趣的是,zsh
它具有内置功能之一,并且可能是唯一能够可靠地处理任意文件路径的功能。
要通过不同路径标识同一文件,gfind -printf
还stat
可以通过报告应唯一标识它们的文件的设备和索引节点号来使用 , 。
要进行求和,bc
或awk
shell 算术都可以做到。
perl
、ruby
abd等编程语言也许python
也可以相对轻松地完成上述所有操作。
例子:
LC_ALL=C find /foo ! -name '*.jpg' -printf '%D:%i %b\n' | awk '
! seen[$1]++ {sum += $2}
END {print sum * 512}
使用 GNU 实现find
将为您提供名称不以 结尾的文件的磁盘使用情况.jpg
,即使每个文件链接到多个目录,也仅对每个文件进行一次计数。
zsh
与:相同
set -o extendedglob
zmodload zsh/stat
typeset -A du
for file (/foo/**/^*.jpg(NDoN)) {
stat -LH s -- $file &&
du[$s[device]:$s[inode]]=$s[blocks]
}
print $(( 512 * (${(j[+])du}) ))