如何在Linux中获取文件或目录的大小

当您使用Linux du命令时,您可以获得文件或目录的实际磁盘使用量和实际大小。我们将解释为什么这些值不相同。

实际磁盘使用率和实际大小

文件的大小和它在硬盘上占用的空间很少相同。磁盘空间是以块为单位分配的。如果文件比块小,则仍会为其分配整个块,因为文件系统没有更小的空间单位可供使用。

除非文件的大小正好是块的倍数,否则它在硬盘驱动器上使用的空间必须始终四舍五入到下一个完整的块。例如,如果文件大于两个数据块但小于三个数据块,则仍需要三个数据块来存储它。

对于文件大小使用两个测量值。第一个是文件的实际大小,即组成文件的内容的字节数。第二个是硬盘上文件的有效大小。这是存储该文件所需的文件系统块数量。

一个例子

让我们看一个简单的例子。我们将单个角色重定向到文件中以创建一个小文件:

echo "1" > geek.txt

现在,我们将使用长格式清单,即ls,来查看文件长度:

ls -l geek.txt

长度是Dave Dave条目后面的数字值,为两个字节。当我们只向文件发送一个字符时,为什么是两个字节?让我们来看看文件中发生了什么。

我们将使用十六进制转储命令,该命令将给出精确的字节计数,并允许我们将非打印字符“看到”为十六进制值。我们还将使用-C(规范)选项强制输出在输出正文中显示十六进制值,以及它们的字母数字等效字符:

hexdump -C geek.txt

输出显示,从文件的偏移量00000000开始,有一个字节包含十六进制值31,另一个字节包含十六进制值0A。输出的右侧部分尽可能将这些值描述为字母数字字符。

十六进制值31用于表示数字1。十六进制值0A用于表示换行符,它不能显示为字母数字字符,因此显示为句点(.)。取而代之的是。换行符由ECHO添加。默认情况下,Echo在显示需要写入终端窗口的文本后开始一个新行。

这与olls的输出一致,并与两个字节的文件长度一致。

相关:如何使用ls命令列出Linux上的文件和目录

现在,我们将使用du命令查看文件大小:

du geek.txt

上面说尺码是四号,但是是什么的四号呢?

有块,然后有块

当du报告文件大小(以块为单位)时,它使用的大小取决于几个因素。您可以在命令行上指定它应该使用的块大小。如果不强制du使用特定的块大小,它将遵循一组规则来决定使用哪一个。

首先,它检查以下环境变量:

DU_BLOCK_SIZE。 块大小(_S)。 块大小

如果其中任何一个存在,则设置块大小,并且du停止检查。如果未设置,则Du默认为块大小1,024字节。除非设置了名为POSIXLY_CORRECT的环境变量。如果是这种情况,则du缺省为512字节的块大小。

那么,我们如何找出哪一个正在使用呢?您可以检查每个环境变量来解决问题,但是有一种更快的方法。让我们将结果与文件系统使用的块大小进行比较。

要发现文件系统使用的块大小,我们将使用tune2fs程序。然后,我们将使用-l(列出超级块)选项,通过grep管道输出输出,然后打印包含单词“Block”的行。

在本例中,我们将查看第一个硬盘驱动器sda1的第一个分区上的文件系统,并且我们需要使用sudo:

sudo tune2fs -l /dev/sda1 | grep Block

文件系统块大小为4,096字节。如果我们将其除以从du Du(4)获得的结果,则显示Du的默认数据块大小为1,024字节。我们现在知道了几件重要的事情。

首先,我们知道可用于存储文件的最小文件系统占用空间是4096字节。这意味着即使是我们的两个字节的小文件也会占用4KB的硬盘空间。

第二件要记住的事情是,专门报告硬盘驱动器和文件系统统计信息的应用程序(如du、ls和.tune2fs)可能会对“块”的含义有不同的理解。tune2fs应用程序报告真实的文件系统块大小,而ls和du可以配置或强制使用其他块大小。这些块大小与文件系统块大小无关;它们只是那些命令在其输出中使用的“块”。

最后,除了使用不同的块大小之外,du和tune2fs的答案表达了相同的含义。tune2fs结果是一个4096字节的块,du结果是4个1024字节的块。

使用DU

在没有命令行参数或选项的情况下,du列出当前目录和所有子目录正在使用的总磁盘空间。

我们来看一个例子:

du

该大小以默认块大小(每个块1,024字节)报告。遍历整个子目录树。

在不同目录上使用DU

如果您想让Du报告与当前目录不同的目录,可以在命令行上传递该目录的路径:

du ~/.cach/evolution/

在特定文件上使用du

如果希望du报告特定文件,请在命令行上传递该文件的路径。您还可以将外壳模式传递给选定的一组文件,如*.txt:

du ~/.bash_aliases

关于目录中的文件的报告

要让du报告当前目录和子目录中的文件,请使用-a(所有文件)选项:

du -a

对于每个目录,将报告每个文件的大小,以及每个目录的总大小。

限制目录树深度

您可以告诉du列出一定深度的目录树。为此,请使用-d(最大深度)选项并提供深度值作为参数。请注意,所有子目录都会被扫描并用于计算报告的总数,但它们并没有全部列出。要将最大目录深度设置为一个级别,请使用以下命令:

du -d 1

输出列出了当前目录中该子目录的总大小,并提供了每个子目录的总大小。

要列出更深一级的目录,请使用以下命令:

du -d 2

设置块大小

您可以使用BLOCK选项为当前操作设置DU的块大小。要使用一个字节的块大小,请使用以下命令获取目录和文件的确切大小:

du --block=1

如果要使用1兆字节的块大小,可以使用-m(兆字节)选项,该选项与--block=1M相同:

du -m

如果希望根据目录和文件使用的磁盘空间以最合适的块大小报告大小,请使用-h(人类可读)选项:

du -h

要查看文件的表观大小而不是用于存储文件的硬盘空间量,请使用--表观大小选项:

du --apparent-size

您可以将其与-a(All)选项结合使用,以查看每个文件的外观大小:

du --apparent-size -a

列出了每个文件及其外观大小。

仅显示合计

如果您希望du仅报告该目录的总数,请使用-s(汇总)选项。您还可以将其与其他选项结合使用,例如-h(人类可读)选项:

du -h -s

在这里,我们将把它与--外观大小选项一起使用:

du --apparent-size -s

显示修改时间

要查看创建或上次修改时间和日期,请使用--time选项:

du --time -d 2

奇怪的结果?

如果您从du看到奇怪的结果,特别是当您交叉引用其他命令的输出大小时,这通常是因为不同命令可以设置的块大小不同,或者它们默认设置的块大小不同。这也可能是由于实际文件大小和存储它们所需的磁盘空间之间的差异造成的。

如果需要匹配其他命令的输出,可以尝试使用du中的--block选项。

相关文章