将 -h 标志传递给 du 时出现意外行为

将 -h 标志传递给 du 时出现意外行为

在我生活在 *nix 世界中的这段时间里,我一直认为当命令接受标志时,-h我唯一需要改变的就是打印语句的有效格式。我通常不会重新审视这一点,但我确实发现一般情况下确实如此。

今天,当我测量我正在写入的目录的大小时,我有一次非常奇怪的经历。

>>> du -s
15565160    .
>>> du -sh
7.4G    .

起初我以为我只是在一个奇怪的地方捕获了目录,但我发现这两个值都非常稳定,随着我不断写入目录,返回的值只略有增加/减少。我的第一个假设是这是一种奇怪的中间状态,但在那种情况下,我本以为结果会有剧烈波动,但du -s我没有观察到。

这是怎么回事?这个155...数字是多少?它似乎不是字节数。两者之间的比率似乎相当一致,约为 450。也就是说,如果我将 的结果乘以du -s450,我得到的值就非常接近 所暗示的字节数du -sh

更大的问题是我是否一直都错了。为什么-h在这种情况下添加标志除了改变打印格式之外还有其他作用?

答案1

首先,你是对的。该-h标志(当不用于打印帮助文本时)用于告诉各种应用程序转变将输出转换为“人类可读格式”。这很重要……我们稍后会讨论它。du特别是,该-s标志给出了其正常“每个目录”输出的摘要。基本上,它将所有内容加在一起。

du默认返回目录及其内容在存储介质上占用的逻辑块数。占用的块数对于许多磁盘实用程序和脚本很有用...但它不太“人性化”。-h 标志将块数转换回字节数,然后四舍五入到最接近的 1024 倍数(还有一些其他的诡计...我们最终得到千兆字节数和小数点后一位数)。

根据您的描述,我敢打赌您的系统配置为 512 字节块大小,因为:

15565160 * 512 / 1024^3

需要注意的是,du假定块大小等于(按顺序),标志设置的值, 、或环境变量--block-size=的值,或。1024 字节是大多数现代文件系统使用的常见默认块大小。但 512 字节块并不罕见。检查这些变量,其中一个可能设置为 512。或者您可能有一个特别旧的 版本。DU_BLOCK_SIZEBLOCK_SIZEBLOCKSIZE1024du

相关内容