ディレクトリサイズ計算の違い


9

署名目的でターミナルのディレクトリのサイズを取得する必要があります。私は次のコマンドを使用しています:

du -s /path/to/dir

結果に従来のUNIXブロックサイズ(512バイト)を掛けて、実際のディレクトリサイズをバイト単位で取得します。ただし、Finderの[情報を見る]ダイアログウィンドウには、ターミナルコマンドで計算されたサイズよりも少し小さいサイズが表示されます。そして、それはどのフォルダー/バンドルでも再現可能であるようです。何が欠けていますか?

回答:


11

通常、ディスクの使用状況duに関する情報を表示します(名前の由来です)。それを念頭に置いて

disk usage != sum of file sizes

各ファイルはファイルシステム上で多数のブロックを占有するman mkfs.ext2ためです(例を参照)。これは、非常にまれな状況でのみ、ファイルのディスク使用量が実際のサイズに等しいことを意味します。そのためには、サイズはブロックサイズの正確な倍数でなければなりません。

ファイルシステムブロックは、ファイルの一部を含むボックスと考えることができます。それぞれが1つのファイルの一部のみを含むことができます。

のGNUバージョンについてはdu--apparent-sizeオプションを確認してください。


ファイルシステムにスパースファイルがある場合、さらに興味深い状況が発生する可能性があります。


そのようなオプションはありません(私はLinuxではなくOS Xを使用しています)。おそらくタグでは十分ではないので、質問でそのことを言及する必要があると思われます。)
Eimantas

ああ、そうです...次にマンページを見て、actualまたはへの参照を見つけてくださいapparent。(私の更新された説明も参照してください)。
rozcietrzewiacz

2
不平等を除いて正しい。ファイルサイズは、それらを格納するために必要な実際のディスク容量よりも大きい場合があります。(unix.stackexchange.com/q/33801/9426
ステファン・ヒメネス

@StéphaneGimenezうわー...教えてくれてありがとう!
rozcietrzewiacz 2012年

2

Mac OS XとFinder(Snow Leopardバージョン10.6.8)について私は次のことに気づきました。

  • Finderのパス(ファイルまたはフォルダー)の「定量化された」数値のバイトカウントをbash以下のコード((1)内)で取得します。
  • Finderの「情報」ウィンドウとペインには、バイナリ(base 2、1024)バイトではなく、10進数(base 10、1000)バイトの「定量化された」(KB単位のキロバイトなど)数値が表示されるため、 1000と単位(バイト)のプレフィックス 'quantifier'(大きさ)を増やし、奇妙な「オフキー」丸めを行います。(私の完全なコードはコメントアウトされた開発コードでいっぱいであり、いくつかのファイル(および言語)に分割されているため、共有するのは困難です。)
    私の「定量化」数値は、Finderの「定量化」数値と同じです。
  • また、コードに加えBLOCKSIZEて、シェルに環境変数が設定されていない(そして設定されたことがない)と言いたいのですが、両方のバージョン(今のところ少し)をテストしたところ、のデフォルト値$BLOCKSIZEと同じ値が得られました。

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • 私がなんとかマッチさせなかった数量化されていない数。
    私が言える唯一のことは、ファイルを数えるだけで(つまり、ディレクトリ〜 'file-system meta index / header'〜dataを除外して)近づき、最も近いのは次のものであるということです。

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • (xnu)du(1)も(gnu )(1)もgdu拡張属性(xattr)をカウントしないようです

そして私はちょうどなければなりませんしゃれ「ファイル名を指定して実行は、パスをし、数学行う」
アウト平和をして、この時間をfo'realおやすみ。


1

私のUbuntuシステムでは、ext4を使用して du -b file、実際のファイルdu -b dirのサイズをバイト単位で示し、ファイルのサイズをバイト単位で示します+オーバーヘッドは、私の場合、4096バイトの倍数です。

このオーバーヘッドは、ファイルの数が増えるにつれて増加します。
注:ファイルが削除されても、ディレクトリのオーバーヘッドは、ファイルが削除される前の高レベルのままです。

再起動してみて、元に戻るかどうかは確認していませんが、どちらの場合も、ディレクトリのサイズは過去の状況によって異なります。

合計ファイルサイズの正確な値を得るには、各ファイルサイズを集計することが最適なオプションになる場合があります

次のスクリプトは、すべてのファイルサイズを合計します(バイト単位)。

OS Xの場合、あなたが持っていない場合は-b「ドゥ」のOPTONを、あなたが使用することができますstat...コメント行ショーのUbuntu:代わりに(あなたがそれを持っている場合)。statの代わりにdu -b

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSXに du -bとは異なりstatます。どちらの方法でも、スクリプトはLinux外に移植できません。
Gilles 'SO-邪悪なことをやめなさい'

OS XのMacPortsを使用してcoreutilsduasのGNUバージョンを取得するためにインストールできますgdu。そのため、正確には移植可能ではありませんが、OS Xの人々がいくつかのコアユーティリティのGNUバージョンを入手するのに役立つ場合があります。
drfrogsplat 2012年

1

ディレクトリ内のすべてのファイルを合計します。

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


find: unrecognized: -printf。高山の画像
ガデラット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.