web-dev-qa-db-ja.com

duとlsは異なるディレクトリサイズを報告しますか?

コピー操作が正常に完了したこと(または少なくともファイルをスキップしなかったこと)を確認しようとして、ソースディレクトリと宛先ディレクトリ内でdu -bを実行したところ、約100KBの違いが見られました。

そこで、違いを追跡して、duがコピーとオリジナルの合計サイズの違いを報告する(多くの)リーフディレクトリを見つけました。

奇妙なことに、ls -lはこれらのディレクトリを完全に同一として表示します。

2つの異なるディレクトリにある2つの出力は次のとおりです。

root@...:/local/.../DCIM/100___12# du -b
5286222389      .
root@...:/local/.../DCIM/100___12# ls -l --block-size=1
total 5292851200
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
-rwxr--r-- 1 markus markus   2236594 Aug  5  2013 IMG_0005.JPG
...

vs.

root@...:/local_old/.../DCIM/100___12# du -b
5286226485      .
root@...:/local_old/.../DCIM/100___12# ls -l --block-size=1
total 5292851200
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
-rwxr--r-- 1 markus markus   2236594 Aug  5  2013 IMG_0005.JPG
...

du -bによって報告されたサイズがls -lによって報告されたサイズよりも小さく、2つのディレクトリで異なることに注意してください。 全体ls -lの出力は、両方のディレクトリで同じです。

このディレクトリにはシンボリックリンクやシステムファイルはありません。これは、一連の.jpgファイル(カメラのSDカードからの直接コピー)と、Windowsが(sambaを介して)作成したThumbs.dbファイルです...

これらのコマンドがどのように機能するかについて何かが足りませんか?

(私はDebianWheezyを実行していてuname -a出力Linux ... 3.2.0-4-AMD64 #1 SMP Debian 3.2.63-2+deb7u1 x86_64 GNU/Linux

1
Markus A.

-aスイッチをlsに追加した後、次のようになりました。

root@...:/local/.../DCIM/100___12# du -b
5286222389      .
root@...:/local/.../DCIM/100___12# ls -al --block-size=1
total 5292867584
drwxr-xr-x 2 markus markus     12288 Aug  5  2013 .
drwxr-xr-x 4 markus markus      4096 Aug  5  2013 ..
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
...

vs.

root@...:/local_old/.../DCIM/100___12# du -b
5286226485      .
root@...:/local_old/.../DCIM/100___12# ls -als --block-size=1
total 5292871680
drwxr-xr-x 2 markus markus     16384 Aug  5  2013 .
drwxr-xr-x 4 markus markus      4096 Aug  5  2013 ..
-rwxr--r-- 1 markus markus   2167504 Aug  5  2013 IMG_0004.JPG
...

.ディレクトリのサイズの違いに注意してください。これは、du -bによって報告された違いを正確に補います。

また、lsによって報告されたtotalは、実際にはバイトではなくブロックになっているようです。したがって、答えは@ jcbermが提案したようなものですが、逆に:

はい、どちらも正しいですが、lsは使用済みfsブロックの合計サイズを報告し(ただし、個々のファイルサイズはバイト単位)、du -bはバイトを報告します。

私が見ている送信元と宛先の違いは、.について報告されたサイズの違いが原因です。これがどこから来たのか、別の話です。おそらく、ある時点で一方が他方よりも多くのディレクトリエントリを予約したためです。しかし、少なくとも今では、コピープロセスで何かが見落とされることを心配することはもうありません。次のステップは、duに合計で...を無視するように指示する方法を理解することです。これで、問題が解決するはずです。

0
Markus A.

どちらも正しいです。

  • lsファイルの正確なバイトを表示します
  • dはディスク使用量を示しています。これは、システムがブロックを使用してファイルを保存するため、異なります。

次のコマンドで、ファイルシステムが使用しているブロックサイズを確認できます。

blockdev --getbsz <partition>

例えば:

blockdev --getbsz /dev/sda1
3
jcbermu