Symlink

帶有 -L 標誌的 du 命令的行為

  • July 16, 2013

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如果每個文件連結多次,則只會計算一次。如果您執行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,它將跟隨符號連結,但如果目標文件有一個它已經看到的 inode 編號,它將不會被重新計算。只要-l它會計算重複的硬連結,但不會遵循符號連結。

如果同時使用-land -L,它既會跟隨符號連結,也允許多次計算目標文件。

引用自:https://unix.stackexchange.com/questions/82466