-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
そして、シンボリックリンクは逆参照されません。何か不足していますか?
デフォルトでは、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
を一緒に使用すると、どちらもシンボリックリンクをたどり、ターゲットファイルを複数回カウントすることもできます。