我注意到命令与命令行选项du
一起使用时出现奇怪的行为。-L
我正在使用 Slackware 14 和 Coreutils 8.19。
要重现奇怪的行为,请创建两个文件夹:
mkdir foo
mkdir bar
在其中一个文件夹中创建一个文件:
perl -e 'print "A"x10000' > foo/text
另一个文件夹中的符号链接:
ln -s ../foo/text bar/text
现在,如果您输入:
du -h -L bar
你会得到:
16k bar
由于符号链接被取消引用。但如果你输入:
du -h -L *
你会得到:
16K foo
4.0K bar
并且符号链接不会被取消引用。我错过了什么吗?
答案1
默认情况下,du
如果每个文件链接多次,则仅对每个文件计数一次。如果您运行它,du -L bar
它将对文件进行计数,因为它只到达一次。但是,如果您运行du -L *
它,它只会在第一次看到它时才对其进行计数。例如:
$ du -L foo bar
16K foo
4.0K bar
$ du -L bar foo
16K bar
4.0K foo
请注意,交换参数的顺序会更改报告为 16K 的文件夹。
您可以du
通过传递参数来强制对文件进行两次计数-l
。
编辑:
符号链接是一种特殊类型的文件,需要额外的步骤来跟踪该链接。除非启用du
该选项,否则不会跟踪符号链接。-L
另一方面,硬链接基本上是存在于两个(或更多)文件夹中的一个文件。du
据推测,它通过 inode 编号跟踪它所看到的文件,以避免对这些文件进行两次计数。-l
禁用此行为。
因此,使用 just -L
,它将遵循符号链接,但如果目标文件具有它已经看到的索引节点号,则不会重新计数。仅使用-l
它就会计算重复的硬链接,但不会遵循符号链接。
如果您同时使用-l
和-L
,它将既遵循符号链接,也允许多次对目标文件进行计数。