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

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

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

$ 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

这是输出du

$ du -sh *
504K    jeter
4.0K    mariano

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

$ ln jeter/zero_file.1 mariano/zero_file.2
$ du -sh *
504K    jeter
4.0K    mariano

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

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

答案1

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

去测试:

mkdir alexandru
ln mariano/zero_file.2 alexandru/zero_file.0
du -sh *

现在您应该看到alexandru占用了 500K+。因此,如果不看代码du,我猜它存储了已遍历的 inode 列表,并且不会重新访问已看到的 inode。

答案2

如果你

du -sh jeter jeter mariano

然后你会得到两种不同尺寸的喷射器。

这似乎与上述发现一致……

... 除了第一个值不应该是总数而第二个值应该是零之外?

答案3

显然,当fstat(3)看到硬链接数大于 1 时,它会记录 inode 号,以便后续匹配。根据POSIX

具有多个链接的文件应仅被计数并写入一个条目。报告中所选的目录条目未指定。

shell*按照词汇顺序扩展 glob,如下所示POSIX

如果模式与任何现有的文件名或路径名匹配,则该模式将被替换为那些文件名和路径名,并根据当前区域设置的排序顺序进行排序。

然而,当du -sh不进行通配符操作时,必须以某种方式决定顺序,但听起来它必须依赖于实现。

请注意,这两个命令会产生不同的结果:

du -sh jeter mariano
du -sh mariano jeter

答案4

如果您想检查 rsync 时间机器的备份是否有效,以及可能更重要的是您节省了多少备份空间,您应该执行一个ls -cr | xargs du -hs将目录按du正确的顺序(创建时间的反转)输入的操作。

相关内容