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


11

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

而且符号链接不会被取消引用。我想念什么吗?


似乎du想在这里玩聪明,但是如果您运行df -a -L bar foo输出是非常错误的(将bar中的16K计数留给foo空)。
guido

Answers:


18

默认情况下,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大概通过索引节点号跟踪它已查看的文件,以避免对这些文件计数两次。-l禁用此行为。

因此,使用just -L,它将跟随符号链接,但是如果目标文件具有索引节点号,那么它已经被看到,则不会被重新计数。仅凭-l它就可以计算重复的硬链接,但不会跟随符号链接。

如果一起使用-l-L,它将既跟随符号链接,又允许多次计数目标文件。


谢谢。这可行。但是,我想提供一些额外的解释。在手册页,我读了-lcount sizes many times if hard linked,但我在这里用符号链接工作。而且,-l单独使用并不能解决问题,而如果我同时使用两者-l-L则可以正确计算大小。
Zagorax

@Zagorax是啊,男人页面上有点不清楚如何-l-L互动。解释太久了,无法发表评论,所以我更新了答案。
David Baggerman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.