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