当我尝试使用 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
错在哪里?
61G是最后一项的总和。
如果您向后滚动或使用 grep,您会看到更多总数。
find . -print0 | xargs -r0 du -chx|grep total
您正在为每个后续目录和子目录请求“du -chx”,而不是一起请求。
您从“find”命令中看到的 61G 总数只是 xargs 看到的最后“批次”参数的总数。(xargs 只能接受有限数量的参数,因此您看到的“总数”不是“总计”。)
试试这个:
find pjproject-2.1.0/ -print0 | xargs -r0 du -chx | grep "total"
假设没有名为“total”的文件,您将看到一个总数列表,这些总数或多或少与 du 命令的输出相加。
一个错误是 find|du 会将重复的结果相加,例如,对于目录结构 foo/bar/baz,它会有效地执行 'du -chx foo foo/bar foo/bar/baz'。这将 foo/bar/baz 目录计算了 3 次。但是,这会偏高,因此无法解释您所看到的。
第二个问题是您传递给 du 的参数数量。在 find 情况下,您将有数千个参数,并且 xargs 将分块处理它们。您实际上并没有看到所有文件的总数,而是其中一部分的小计。在此过程中还会打印其他几个小计。阅读 xargs 的手册页,特别是 -n(最大参数)和 -s(最大命令行长度)
在这里做的正常事情是不要依赖总和来调用“du”,而是在管道中的另一个命令中进行总和。然而,一旦你尝试这个,你就会遇到我提到的第一个问题——你多次计算目录。