为什么“找到。-print0 | xargs -r0 du -chx”和“du -chx”会有不同的结果?

时间:2014-02-04 07:21:01

标签: linux bash xargs du

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

%df -h给出相同的结果: 使用的文件系统大小可用使用%挂载 / dev / md7 3.6T 2.8T 599G 83%/ opt

哪里出错?

3 个答案:

答案 0 :(得分:1)

61G是最后一项的总和。

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

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

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

答案 1 :(得分:0)

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

试试这个:

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

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

答案 2 :(得分:0)

一个错误是find | du会添加重复的结果,例如使用目录结构foo / bar / baz它会有效地执行'du -chx foo foo / bar foo / bar / baz'。这是foo / bar / baz目录的3倍。然而,这会在高位错误计算,所以不能解释你所看到的。

第二个问题是您传递给du的参数数量。在查找案例中,您将拥有数千个参数,而xargs将以块的形式处理它们。你实际上并没有看到所有文件的总数,而是它们的一大块的小计。沿途还会印出其他几个小计。阅读xargs的手册页,特别是-n(max args)和-s(命令行的最大长度)

这里做的正常事情是不要依赖于单个调用'du'的总和,而是在管道中的另一个命令中执行求和。但是,一旦你尝试这个,你就会遇到我提到的第一个问题 - 你多次计算目录。