web-dev-qa-db-ja.com

duは、無視するハードリンクをどのように決定しますか?

2つのディレクトリがあります。

$ ls -l
total 8
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 jeter
drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 mariano

最初のフォルダーに1つのファイルを作成します。

$ dd if=/dev/zero of=jeter/zero_file.1 bs=512000 count=1
1+0 records in
1+0 records out
512000 bytes (512 kB) copied, 0.268523 s, 1.9 MB/s

これはduの出力です:

$ du -sh *
504K    jeter
4.0K    mariano

予想どおり、zero_file.のハードリンクを他のフォルダーに配置しても、duの出力は変わりません。

$ ln jeter/zero_file.1 mariano/zero_file.2
$ du -sh *
504K    jeter
4.0K    mariano

ただし、私が知る限り、ファイルシステムには元のファイルとしてzero_file.1を指すものはありません。では、duはどのようにしてzero_file.1をカウントするが、zero_file.2はカウントしないのでしょうか。

すべてのハードリンクが1つのiノードを共有しているため、タイムスタンプの比較にはなりません。それらは同じタイムスタンプデータを正しく持っていますか?

4

テストを3つのフォルダーに拡張すると、iノードが最初にヒットしたときにのみduがカウントすることがわかります。個々のフォルダに移動してduを実行すると、フルサイズが表示されます。

テストする:

mkdir alexandru
ln mariano/zero_file.2 alexandru/zero_file.0
du -sh *

alexandruが500K以上を占めているのがわかります。したがって、duコードを見ずに、トラバースされたiノードのリストが格納されており、すでに表示されているものを再検討していないと思います。

10
roguesys

もしあなたがそうするなら

du -sh jeter jeter mariano

次に、ジーター用に2つの異なるサイズを取得します。

これは上記の発見と一致しているようです...

...ただし、最初の値を合計にして2番目の値をゼロにするべきではありませんか?

4
SilverWave

どうやら、fstat(3)は、ハードリンクの数が1より大きいことを確認すると、後続の照合のためにiノード番号を記録します。 [〜#〜] posix [〜#〜] によると:

複数のリンクがあるファイルは、1つのエントリに対してのみカウントおよび書き込みされます。レポートで選択されているディレクトリエントリは指定されていません。

シェルは、 [〜#〜] posix [〜#〜] に従って、*グロブを辞書式順序で展開します。

パターンが既存のファイル名またはパス名と一致する場合、パターンはそれらのファイル名とパス名に置き換えられ、現在のロケールで有効な照合順序に従ってソートされます。

ただし、du -shがグロブなしで実行される場合、順序は何らかの方法で決定する必要がありますが、実装に依存する必要があるように思われます。

これらの2つのコマンドは異なる結果をもたらすことに注意してください。

du -sh jeter mariano
du -sh mariano jeter

Rsync Time Machineからのバックアップが機能するかどうか、そしておそらく節約しているバックアップスペースの量を確認したい場合は、ディレクトリをduにフィードするls -cr | xargs du -hsを実行する必要があります。正しい順序(作成の逆の時間)。

1
Udo Kaune