web-dev-qa-db-ja.com

duを含むフォルダのサイズ

rsyncを使用して、シンボリックリンク、ハードリンク、権限、宛先上のファイルの削除などを含むフォルダーをコピーしました。それらはかなり同一でなければなりません。

1つのフォルダーはUSBドライブにあり、もう1つのフォルダーはローカルディスクにあります。

両方のフォルダでdu -blsを実行すると、サイズがわずかに異なります。

私のdu--apparent-sizeをサポートしており、-sによって適用され、-lはハードリンクのコンテンツをカウントする必要があります。

この違いはどのように説明でき、実際の合計をどのように取得できますか?

どちらのファイルシステムもext4です。唯一の違いは、USBドライブが暗号化されていることです。

編集:

私は実際に異なっていたフォルダーを探して掘り下げました、1つを見つけました、そしてその内容は特別ではありません(ブロックデバイス、パイプ、ハードまたはシンボリックリンク、ゼロバイトファイルなし)、その中にいくつかの小さなファイルがある可能性があります。違いは、この特定のフォルダーの872830と881022です。

また、両方のフォルダでdu -blscを実行しましたが、この場合の結果は同じです。

使用したコマンドの詳細:

$ du -Pbsl $LOCALDIR $USBDIR | cut -f1
872830
881022

$ du -Pbslc $LOCALDIR/*
[...]
868734  total

$ du -Pbslc $USBDIR/*
[...]
868734  total

$ ls -la $USBDIR | wc
    158    1415    9123
$ ls -la $LOCALDIR | wc
    158    1415    9123

$ diff -sqr --no-dereference $LOCALDIR $USBDIR | grep -v identical
[No output and all identical if I remove the grep]
4

rsyncを使用してファイルをコピーし、diffを使用して2つのファイルセットを比較したため、diffは違いを報告しないため、2つのファイルセットは同一です。

サイズの違いは、おそらく2つのディレクトリ構造内の実際のディレクトリノードのサイズによって説明できます。一部のファイルシステムでは、ファイルまたはサブディレクトリが削除されてもディレクトリが切り捨てられず、実際に必要なものよりわずかに大きいディレクトリノードが残ります。

ある時点で、後で削除された多くのファイルを保持している場合、大きなディレクトリノードが残っている可能性があります。

例:

$ mkdir dir
$ ls -ld dir
drwxr-xr-x  2 kk  wheel  512 May 11 17:09 dir
$ touch dir/file-{1..1000}
$ ls -ld dir
drwxr-xr-x  2 kk  wheel  20480 May 11 17:09 dir
$ rm dir/*
$ ls -ld dir
drwxr-xr-x  2 kk  wheel  20480 May 11 17:09 dir
$ du -h .
20.0K   ./dir
42.0K   .
$ ls -R
dir

./dir:

作成した1000個のファイルを削除したにもかかわらず、dirディレクトリが20 KBを使用していることに注意してください。

11
Kusalananda

ファイルシステムのブロックサイズを確認しましたか?両方のデバイスが同じファイルシステムを使用している場合でも、ブロックサイズが異なる可能性があり、これにより「わずかに異なる」サイズが説明される可能性があります。

たとえば、8KiBのブロックサイズを使用するようにファイルシステムが設定されているデバイスに1KiBのファイルの束を保存すると、使用されるブロックごとに7KiBの無駄が生じます。ファイルがディスクから取得している実際のサイズは、使用されているブロックのサイズであり、この場合はファイル自体のサイズではありません(ブロックごとに複数のファイルを保存するための何らかのツールがない限り)。以下のコマンドを使用して、さまざまなデバイスのブロックサイズを確認してください。

# blockdev --getbsz <DEVICE>
1