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

Zag*_*rax 14 disk-usage coreutils symlink

du-L命令与命令行选项一起使用时,我注意到命令的奇怪行为。

我正在使用 Slackware 14 和 Coreutils 8.19。

要重现奇怪的行为,请创建两个文件夹:

mkdir foo
mkdir bar
Run Code Online (Sandbox Code Playgroud)

在其中一个文件夹中创建一个文件:

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
Run Code Online (Sandbox Code Playgroud)

并且符号链接不会被取消引用。我错过了什么吗?

Dav*_*man 25

默认情况下,du如果每个文件被链接多次,则只计算一次。如果你运行du -L bar它会计算文件,因为它只到达它一次。但是,如果您运行du -L *它,它只会在第一次看到它时计算它。例如:

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo
Run Code Online (Sandbox Code Playgroud)

请注意,交换参数的顺序会更改哪个文件夹被报告为 16K。

您可以du通过传递-l参数来强制对文件进行两次计数。

编辑:

符号链接是一种特殊的文件,需要一个额外的步骤来跟随链接。du除非-L启用该选项,否则不会遵循符号链接。

另一方面,硬链接基本上是存在于两个(或更多)文件夹中的一个文件。du大概跟踪它通过 inode 编号看到的文件,以避免将这些文件计数两次。-l禁用此行为。

因此,使用 just -L,它将遵循符号链接,但如果目标文件具有它已经看到的 inode 编号,则不会重新计数。只是-l它会计算重复的硬链接,但不会遵循符号链接。

如果您一起使用-l-L,它将遵循符号链接,并且还允许多次计算目标文件。