带有“-L”标志的“du”命令的行为

带有“-L”标志的“du”命令的行为

我注意到命令与命令行选项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,它将既遵循符号链接,也允许多次对目标文件进行计数。

相关内容