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


11

コマンドラインオプションで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

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


それはそうですduここに巧妙なプレイしたいが、あなたが実行した場合df -a -L bar fooの出力を(空のFOOを残すバーで16Kを数えて)非常に間違っています。
guido 2013

回答:


18

デフォルトで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として報告されるフォルダーが変わることに注意してください。

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

編集:

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

一方、ハードリンクは、基本的に1つのファイルが2つ(またはそれ以上)のフォルダーに存在します。duおそらく、これらを2度カウントすることを避けるために、iノード番号でどのファイルを参照したかを追跡します。-lこの動作を無効にします。

したがって、単に-Lを使用すると、シンボリックリンクをたどりますが、ターゲットファイルにiノード番号がある場合、すでに確認済みであるため、再カウントされません。ばかり-lに、重複したハードリンクをカウントしますが、シンボリックリンクをたどりません。

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


ありがとうございました。これは動作します。しかし、私はいくつかの追加の説明が欲しいです。manページで、私はそれを読んで-lいますがcount sizes many times if hard linked、ここではsymlinkを使用しています。さらに、それ-lだけでは問題は解決しませんが、両方を使用する-l-L、サイズが適切にカウントされます。
Zagorax 2013

@Zagoraxええ、manページは、どのように-l、そしてどのように-L相互作用するかについて、少し不明確です。コメントには説明が長すぎたので、回答を更新しました。
David Baggerman 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.