web-dev-qa-db-ja.com

「-L」フラグを指定した「du」コマンドの動作

-Lコマンドラインオプションでduコマンドを使用すると、奇妙な動作に気づきました。

Slackware 14とCoreutils 8.19を使用しています。

奇妙な動作を再現するには、2つのフォルダーを作成します。

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

そして、シンボリックリンクは逆参照されません。何か不足していますか?

11
Zagorax

デフォルトでは、duは、複数回リンクされている場合、各ファイルを1回だけカウントします。 du -L barを実行すると、ファイルは1回しか到達しないため、ファイルがカウントされます。ただし、du -L *を実行すると、初めて表示されたときにのみカウントされます。例えば:

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

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

引数の順序を入れ替えると、16Kとして報告されるフォルダーが変わることに注意してください。

-lパラメータを渡すことにより、duに強制的にファイルを2回カウントさせることができます。

編集:

シンボリックリンクは特別な種類のファイルであり、リンクをたどるには追加の手順が必要です。 duは、-Lオプションが有効になっていない限り、シンボリックリンクをたどりません。

一方、ハードリンクは、基本的に1つのファイルが2つ(またはそれ以上)のフォルダーに存在します。 duは、これらを2度カウントしないように、inode番号で確認したファイルを追跡します。 -lはこの動作を無効にします。

したがって、-Lだけでシンボリックリンクをたどりますが、ターゲットファイルにiノード番号が含まれている場合は、すでに認識されているため、再カウントされません。 -lだけでは、ハードリンクの重複がカウントされますが、シンボリックリンクは追跡されません。

-l-Lを一緒に使用すると、どちらもシンボリックリンクをたどり、ターゲットファイルを複数回カウントすることもできます。

18
David Baggerman