「-L」フラグを含む「du」コマンドの動作

「-L」フラグを含む「du」コマンドの動作

コマンドラインオプションでdu使用すると、コマンドが奇妙に動作することがわかりました。-L

私は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

そしてシンボリックリンクは逆参照されません。私は何を逃したことがありませんか?

答え1

デフォルトでは、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パラメータを渡すと、ファイルが2回計算されるように強制できます-l

編集する:

シンボリックリンクは、リンクを追跡するために追加の手順を必要とする特別な種類のファイルです。このオプションを有効にしないと、duシンボリックリンクをたどることはできません。-L

一方、ハードリンクは基本的に複数のフォルダに存在するファイルです。duおそらく、そのファイルを2回カウントするのを避けるために、inode番号で表されるファイルを追跡します。-lこの動作を無効にします。

したがって、を使用すると-Lシンボリックリンクに従いますが、ターゲットファイルにすでに表示されているinode番号があるかどうかは計算されません。これを使用すると、-l重複したハードリンクは計算されますが、シンボリックリンクは続きません。

-lと両方を使用している場合は、両方-Lともシンボリックリンクに従い、ターゲットファイルを複数回計算できます。

関連情報