Contents

使用du命令计算硬链接到文件大小

1. 概述

我们不妨看看我们的目录有多大。如果这些目录包含指向文件系统中其他文件的链接,这可能会变得更加困难。例如,我们可能有一个文件夹,其中包含指向所有重要文件的链接以进行备份。

如果使用正确,du命令可以帮助我们找出文件使用了多少空间。

在本教程中,我们将了解如何在处理具有硬链接的文件夹时使用du命令。

2. du命令

du命令显示我们的 文件占用了多少磁盘空间。

2.1. 使用du进行总结

我们可以使用du的*-s*开关 来总结目录的内容 。

让我们看一个我们有一些文件的例子:

$ ls
actual_files
$ ls actual_files/
a_large_file  another_large_file

在这里,我们有一个名为actual_files的文件夹,其中包含两个文件。让我们使用du来计算actual_files目录的大小:

$ du -sh *
155M    actual_files

在这里,我们使用了*-h*开关和 -s来向我们展示人类可读值的大小。

2.2. 链接的默认 du行为

现在,让我们在一个单独的目录中创建指向我们文件的链接:

$ mkdir to_backup
$ ln actual_files/a_large_file to_backup/link_to_a_large_file
$ ln actual_files/another_large_file to_backup/link_to_another_large_file
$ ls to_backup/
link_to_a_large_file  link_to_another_large_file 

因此,我们创建了一个新文件夹并创建了指向名为*actual_files 的文件夹中的文件的链接。*让我们看看 du是如何处理它的:

$ du -sh *
155M    actual_files
4.0K    to_backup

这难道不令人惊讶吗?原始文件夹超过 150 MB,但带有链接的文件夹只有 4 KB,即使它链接到相同的文件。

但是,如果我们尝试仅计算包含硬链接的文件夹的大小,则会产生所需的结果:

$ du -sh to_backup/
155M    to_backup/
$ du -sh actual_files/
155M    actual_files/

它表现不同的原因有点牵涉,我们稍后再看。我们先来看看如何让du命令产生我们想要的输出。

3. 使用du命令统计链接

使用链接时,du命令有几个有用的标志。*我们在这里特别感兴趣的是-L-l*标志。其中第一个用于符号链接。**让我们使用第二个,它可以帮助我们进行硬链接:

$ du -slh *
155M    actual_files
155M    to_backup

正如我们所看到的,我们现在得到了我们正在寻找的确切结果。

4. 硬链接和du命令

为了理解为什么du命令的行为方式,让我们看一些 Linux 内部结构。

4.1. 索引节点和硬链接

在 Linux 中,文件在内部由Inode表示。Inode保存文件的元数据。它由一个唯一的数字表示。当我们创建一个文件的硬链接时,我们只是创建了对同一个Inode的另一个引用。

一旦创建了硬链接,硬链接和原始文件之间就没有区别了。

4.2. 索引节点du命令

在上面的示例中,当我们尝试在没有*-l标志的情况下计算文件夹的总大小时,du命令知道它在同一个Inode上运行。因此,它只计算了一次大小,即使有两个对该Inode*的引用。

使用-l*标志时,我们明确要求它报告实际大小,即使对于硬链接也是如此*。因此,当它遇到文件的硬链接时,它会计算链接和文件的大小。