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ノードを共有しているため、タイムスタンプの比較にはなりません。それらは同じタイムスタンプデータを正しく持っていますか?
テストを3つのフォルダーに拡張すると、iノードが最初にヒットしたときにのみdu
がカウントすることがわかります。個々のフォルダに移動してdu
を実行すると、フルサイズが表示されます。
テストする:
mkdir alexandru
ln mariano/zero_file.2 alexandru/zero_file.0
du -sh *
alexandru
が500K以上を占めているのがわかります。したがって、du
コードを見ずに、トラバースされたiノードのリストが格納されており、すでに表示されているものを再検討していないと思います。
もしあなたがそうするなら
du -sh jeter jeter mariano
次に、ジーター用に2つの異なるサイズを取得します。
これは上記の発見と一致しているようです...
...ただし、最初の値を合計にして2番目の値をゼロにするべきではありませんか?
どうやら、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
を実行する必要があります。正しい順序(作成の逆の時間)。