Symlink帶有
帶有 -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
並且符號連結不會被取消引用。我錯過了什麼嗎?
預設情況下,
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
它會計算重複的硬連結,但不會遵循符號連結。如果同時使用
-l
and-L
,它既會跟隨符號連結,也允許多次計算目標文件。