我在很多网站上读到,在Linux中,符号链接(软链接,symlinks)就像指针引用另一个文件,该文件可能位于任何位置(如 Windows 快捷方式)。但是,当我检查其中存在符号链接的文件夹的磁盘使用情况时,我的文件管理器显示的内容与报告的内容不匹配du
。但是,如果我输入du -L
(-L, --dereference; dereference all symbolic links
从手册页),我的文件管理器报告的输出du -L
和大小是相同的。
我的问题是:如果我有一个到大文件的软链接,例如在我的单独home
分区中,我会遇到任何问题吗?
例子:
我的/var/tmp
文件夹现在是空的。让我们创建一个文件:
$ cat /some/file.txt > file.txt
$ du -ac
164 ./file.txt
168 .
168 total
我的文件管理器(在本例中为 Thunar)报告
大小:1 项,共 163.0 kB
好的。现在,让我们创建一个非常大的文件/tmp
及其符号链接:
$ cat /dir/really_big.txt > /tmp/heavy.txt
$ du -a | grep heavy.txt
408 ./heavy.txt
$ ln -s /tmp/heavy.txt heavy.txt
$ du -ac
164 ./file.txt
0 ./heavy.txt
168 .
168 total
目前一切都很好。但如果我打开文件管理器:
大小:2 项,总计 570.3 kB
最后:
$ du -acL
164 ./file.txt
408 ./heavy.txt
576 .
576 total
如果所在分区/var/tmp
有 1 GiB 大,并且我在其中创建了一个指向 1 GiB 文件的链接,那么我的硬盘会死掉吗?我知道du
会输出 168 和 Thunar 1 GiB,但我不知道哪个是正确的。
答案1
当然,符号链接确实占用空间,但只是存储名称和目标以及其他元数据的几个字节所需的空间。符号链接占用的空间不依赖于目标占用的空间(毕竟,目标甚至不需要存在)。
Plaindu
报告目录树在磁盘上占用的空间。du -L
报告的空间将会如果所有符号链接都被其目标替换,则由目录树获取。前者通常是有用的信息;例如,如果您删除了树,它就是您要恢复的空间,并且它(大约)是您备份树所需的空间。
du
目录树上显示的(通常)比文件大小的总和稍大一些。这是由于两件事。首先,du
还计算目录,目录需要一点空间来存储文件名和元数据。第二,du
计算文件占用的磁盘空间,这可能与文件大小不同:最常见的影响是文件占用整数个块(典型的 Linux 安装上为 4kB),因此 1 字节的文件可以du 输出中显示为 4kB;但压缩(例如由稀疏文件在几乎每个 UNIX 文件系统上)都可以使文件大小大于其磁盘使用量。
从您提供的数字来看,Thunar 报告的目录树中文件大小的总和,遵循符号链接。它实际上以一种微妙的方式这么说——它声称总大小是 570.3 kB,而不是磁盘使用量是 570.3 kB。从用户界面或文档中根本看不出来的是,Thunar 在计算大小时遵循符号链接。
哪一个“正确”是一个主观问题。du
报告磁盘使用情况。 Thunar 报告符号链接后的总大小。创建符号链接对磁盘使用的影响可以忽略不计,但根据定义,确实会更改 Thunar 报告的符号链接总大小。
答案2
我认为默认情况下,您的文件管理器会尝试获取软链接指向的文件的大小,而为du
您提供目录和软链接本身的大小,而不是它们指向的文件的大小。
澄清,
`du` -> size of directory + size of all the softlinks
`du -L` -> size of directory + size of all the files that the softlinks are pointing to.
我不确定这是否是您所问的,但如果是,那么我相信这可能是您问题的答案。