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

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

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

文件的大小及其在硬盘驱动器上占用的空间很少相同。磁盘空间按块分配。如果文件小于一个块,则整个文件仍会分配给该文件,因为文件系统没有较小的可用空间单位。

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

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

一个例子

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

回声“ 1”> geek.txt

现在,我们将使用长格式列表,ls,看文件长度:

ls -l geek.txt

长度是跟在后面的数值 戴夫戴夫 条目,即两个字节。当我们仅向文件发送一个字符时,为什么要两个字节?让我们看看文件内部发生了什么。

我们将使用 十六进制转储 命令,它将为我们提供确切的字节数,并允许我们将“非打印字符”“视为”十六进制值。我们还将使用 -C (规范)选项,以强制输出在输出主体中显示十六进制值及其等效的字母数字字符:

hexdump -C geek.txt

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

十六进制值31用于表示数字1。十六进制值0A用于表示换行字符,该字符不能显示为字母数字字符,因此将其显示为句点(。)。换行符由 回声 。默认,回声在显示需要写入终端窗口的文本后开始新行。

与来自的输出相吻合ls 并同意两个字节的文件长度。

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

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

du geek.txt

它说大小是四个,但是四个呢?

有块,然后有块

什么时候 以块为单位报告文件大小,它使用的大小取决于几个因素。您可以在命令行上指定应使用的块大小。如果你不强迫 为了使用特定的块大小,它遵循一组规则来决定使用哪个。

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

  • DU_BLOCK_SIZE
  • BLOCK_SIZE
  • 区块大小

如果存在任何这些,则设置块大小,然后 停止检查。如果没有设置, 默认为1,024字节的块大小。除非,也就是说,一个环境变量叫做 POSIXLY_CORRECT 设置好了。如果是这样, 默认为512字节的块大小。

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

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

在此示例中,我们将查看第一个硬盘驱动器的第一个分区上的文件系统, sda1,我们需要使用 须藤:

须藤tune2fs -l / dev / sda1 | grep块

文件系统块大小为4,096字节。如果我们将其除以得到的结果 (四),它显示了 默认块大小为1,024字节。我们现在知道一些重要的事情。

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

要记住的第二件事是专用于报告硬盘驱动器和文件系统统计信息的应用程序,例如 , ls, 和tune2fs,对于“阻止”的含义可能有不同的概念。这 tune2fs 应用程序报告真实的文件系统块大小,而ls 可以配置或强制使用其他块大小。这些块大小并不旨在与文件系统块大小相关;它们只是这些命令在其输出中使用的“块”。

最后,除了使用不同的块大小,答案来自 tune2fs 传达相同的意思。这 tune2fs 结果是一个4,096字节的块,并且 结果是四个1,024字节的块。

使用

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

让我们看一个例子:

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

使用 在不同的目录上

如果你想 要报告与当前目录不同的目录,可以在命令行中将路径传递到该目录:

du〜/ .cach / evolution /

使用 在特定文件上

如果你想 要报告特定文件,请在命令行中将路径传递到该文件。您还可以将外壳模式传递给一组文件,例如 *。文本文件:

du〜/ .bash_aliases

报告目录中的文件

具有 报告当前目录和子目录中的文件,请使用 -一种 (所有文件)选项:

杜阿

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

限制目录树深度

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

du -d 1

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

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

du -d 2

设置块大小

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

du --block = 1

如果您要使用1兆字节的块大小,则可以使用 -米 (兆字节)选项,与 --block = 1M:

du -m

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

杜-h

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

du --apparent-size

您可以将其与 -一种 (全部)选项,以查看每个文件的外观大小:

du --apparent-size -a

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

仅显示总计

如果你想 要仅报告目录的总数,请使用 -s (总结)选项。您也可以将其与其他选项结合使用,例如 -H (可读)选项:

-h -s

在这里,我们将其与 --apparent-size 选项:

du --apparent-size -s

显示修改时间

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

du --time -d 2

结果奇怪吗?

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

如果您需要匹配其他命令的输出,请尝试使用 - 堵塞 在选项 .


$config[zx-auto] not found$config[zx-overlay] not found