du 如何确定要忽略哪个硬链接?

Bel*_*dez 4 linux filesystems du

我们有两个目录:

$ ls -l
total 8
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 jeter
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 mariano
Run Code Online (Sandbox Code Playgroud)

我在第一个文件夹中创建一个文件:

$ dd if=/dev/zero of=jeter/zero_file.1 bs=512000 count=1
1+0 records in
1+0 records out
512000 bytes (512 kB) copied, 0.268523 s, 1.9 MB/s
Run Code Online (Sandbox Code Playgroud)

这是输出du

$ du -sh *
504K    jeter
4.0K    mariano
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,如果我zero_file.在另一个文件夹中放置一个硬链接,du输出不会改变:

$ ln jeter/zero_file.1 mariano/zero_file.2
$ du -sh *
504K    jeter
4.0K    mariano
Run Code Online (Sandbox Code Playgroud)

但是,据我所知,文件系统中没有任何内容指向zero_file.1原始文件。那么如何du知道数zero_file.1而不数zero_file.2呢?

它不能是时间戳比较,因为所有硬链接共享一个 inode;他们会有相同的时间戳数据吗?

rog*_*sys 10

将您的测试扩展到三个文件夹,您可以看到只有第一次命中 inode 时才du会计数。如果您进入单个文件夹并运行du,您将获得完整大小。

去测试:

mkdir alexandru
ln mariano/zero_file.2 alexandru/zero_file.0
du -sh *
Run Code Online (Sandbox Code Playgroud)

您现在应该看到alexandru占用了 500K+。所以不看du代码,我猜它存储了一个遍历 inode 的列表,并且不会重新访问已经看到的那些。

  • 我相信 du 在上述情况下仅按字母顺序遍历目录,因为这是 glob 扩展通配符 *. 我可能是错的,但我不建议指望按字母顺序排列。 (5认同)
  • @Slartibartfast 你是对的,正在运行 `ls | 排序 -r | xargs du -hs` 显示最后一个文件夹为 500 K。因此它确实按照它看到的顺序跟踪 inode,无论是按字母顺序还是其他顺序。 (2认同)