为什么 Nautilus 显示文件及其硬链接比文件大?

hun*_*nch 2 nautilus files disk-usage hard-link

当我创建一个指向2 KB 文件(称为fun)的硬链接时,Nautilus 将这个硬链接(称为fun-hard)显示为具有相同大小的文件。这两个文件指向同一个inode,因此它们的组合属性也应该只显示 2 KB。但是 Nautilus 却说它们的总大小为 4 KB。为什么?

Mal*_*ppa 5

当然,如果您创建一个文件的硬链接,那么原始文件和硬链接都指向同一个 inode。事实上,两者是等价的——对于系统来说,没有“原始”和“链接”这样的东西。它们只是同一个 inode 的两个访问点。因此,与只有一个访问点时相比,它们一起占用的空间不会更多(文件系统中最微小的信息除外,其中存储了指向某个 inode 的两个指针而不是一个)。

当您使用低级文件系统实用程序(例如du. 例如,这里我有一个目录,其中有一首大约 2.1 MB 的歌曲(FOSS Yeaaaah!,Ben Kerensa 的一首关于 Ubuntu 的很棒的歌曲):

$ ls -li 
total 2124
6424897 -rw-rw-r-- 1 malte malte 2162937 Aug  7 12:53 FOSS Yeaaaah!.mp3
$ du -ch * # display size of all files, and total size
2.1M    FOSS Yeaaaah!.mp3
2.1M    total
$ du -h . # display size of current directory
2.1M    .
Run Code Online (Sandbox Code Playgroud)

当我创建一个硬链接时,比如说Link.mp3,到文件,du实际上识别出两个文件名都指向同一个文件,并且只显示两者之一:

$ ln FOSS\ Yeaaaah\!.mp3 Link.mp3
$ ls -li
total 4248
6424897 -rw-rw-r-- 2 malte malte 2162937 Aug  7 12:53 FOSS Yeaaaah!.mp3
6424897 -rw-rw-r-- 2 malte malte 2162937 Aug  7 12:53 Link.mp3
$ du -ch *
2.1M    FOSS Yeaaaah!.mp3
2.1M    total
$ du -h .
2.1M    .
Run Code Online (Sandbox Code Playgroud)

(它只显示按字母顺序排在第一位的那个 - 如果我命名了 hardlink A.mp3,那么du就会显示那个)。

您遇到的行为很可能是您用来显示文件大小的任何软件中的错误或不准确。如果是 Nautilus(典型 Ubuntu 安装中的标准文件浏览器),那么我可以确认该行为。请参阅此错误报告:

https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/644403

它可能只是“一个功能,而不是一个错误”——因为 Nautilus 试图让普通用户的事情变得简单,它只是忽略了硬链接。这可能并不总是最好的主意。引用错误报告:

Nautilus 试图让事情变得简单。这就是为什么它没有提供建立硬链接的方法。但是如果事情已经很复杂——如果硬链接已经存在——只是忽略它们可能会导致其自身的问题。

总之,如果您使用硬链接,最好依靠终端而不是某些文件浏览应用程序。

  • ...并记住 `du` 的粒度是 4K(至少在默认格式的 ext4 文件系统中)。所以 `du` 会为一个 2K 长度的文件报告 4K ...... (2认同)