0

当我尝试使用 find 获取放置文件的总大小时。-print0 | xargs -r0 du -chx 返回:总共 61G。当我使用独立的 du -chx 时,它给了我:总共 2.8T

% df -h 给出相同的结果: Filesystem Size Used Avail Use% Mounted on /dev/md7 3.6T 2.8T 599G 83% /opt

错在哪里?

4

3 回答 3

1

61G是最后一项的总和。

如果您向后滚动或使用 grep,您会看到更多总数。

find . -print0 | xargs -r0 du -chx|grep total

您正在为每个后续目录和子目录请求“du -chx”,而不是一起请求。

于 2014-02-04T07:29:21.813 回答
0

您从“find”命令中看到的 61G 总数只是 xargs 看到的最后“批次”参数的总数。(xargs 只能接受有限数量的参数,因此您看到的“总数”不是“总计”。)

试试这个:

find pjproject-2.1.0/  -print0 | xargs -r0 du -chx | grep "total"

假设没有名为“total”的文件,您将看到一个总数列表,这些总数或多或少与 du 命令的输出相加。

于 2014-02-04T07:35:01.403 回答
0

一个错误是 find|du 会将重复的结果相加,例如,对于目录结构 foo/bar/baz,它会有效地执行 'du -chx foo foo/bar foo/bar/baz'。这将 foo/bar/baz 目录计算了 3 次。但是,这会偏高,因此无法解释您所看到的。

第二个问题是您传递给 du 的参数数量。在 find 情况下,您将有数千个参数,并且 xargs 将分块处理它们。您实际上并没有看到所有文件的总数,而是其中一部分的小计。在此过程中还会打印其他几个小计。阅读 xargs 的手册页,特别是 -n(最大参数)和 -s(最大命令行长度)

在这里做的正常事情是不要依赖总和来调用“du”,而是在管道中的另一个命令中进行总和。然而,一旦你尝试这个,你就会遇到我提到的第一个问题——你多次计算目录。

于 2014-02-04T07:39:04.067 回答