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

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

署名のために端末からディレクトリサイズを取得する必要があります。次のコマンドを使用しています。

du -s /path/to/dir

結果に既存のUNIXブロックサイズ(512バイト)を掛けて実際のディレクトリサイズ(バイト)を得ました。ただし、Finderの[情報のインポート]ダイアログボックスは、ターミナルコマンドを使用して計算されたサイズよりわずかに小さく表示されます。そして、すべてのフォルダ/バンドルで再現可能なようです。私は何を見逃していますか?

答え1

一般的に、du以下の情報はディスク使用量(それで名前が付けられました)。覚えてください

disk usage != sum of file sizes

各ファイルは一定量のスペースを占めるため彫刻ファイルシステムでは(man mkfs.ext2例を参照)、これはファイルのディスク使用量が実際のサイズと同じ場合が少ないことを意味します。これを行うには、サイズがブロックサイズの正確な倍数でなければなりません。

ファイルシステムブロックをファイルの一部を含むボックスと考えてください。各ブロックにはファイルの一部のみを含めることができます。

GNUバージョンの場合は、duこのオプションを確認してください--apparent-size


少しいるときスパースファイルファイルシステムで!

答え2

Mac OS X と Finder (Snow Leopard バージョン 10.6.8) について以下の点を確認しました。

  • 以下のコード((1))を使用して、Finderはパス(ファイルまたはフォルダ)の「量子化された」数値のバイト数を取得しますbash
  • Finder Info ウィンドウとウィンドウには、2 進数 (2, 1024) バイトではなく 10 進数 (10, 1000) バイトで「量子化された」(例: 1000 KB) の数字が表示されるため、「量子化」を 1000 で割って単位 (バイト) プレフィックス「数量」さあ(サイズ)を付けて、奇妙な「キーから外れた」丸めを行います。 (私のコード全体はコメント付きの開発コードで埋め
    られており、複数のファイル(および言語)に分割されて共有するのは難しいです)。 します。ファインダー。
  • また、コードに加えて、私のシェルに環境変数が設定されていない(一度もなかった)と言いたいのですが、両方のバージョン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

  • 一致できない量子化されていない数値。
    私が言うことができる唯一のことは、ファイルだけを計算して近づいて(したがって〜 'filesystem Metaindex /headers'〜データディレクトリを除く)、私が得た最も近いのは次のようなことです。

#!/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)gdu(1)も拡張属性を計算していないようです(xattr

だから私はする必要があります愚かな「道を走り、計算をしましょう。」
今回は落ち着いてください。本当におやすみなさい。

答え3

ディレクトリ内のすべてのファイルの合計:

オペレーティングシステム: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}'

答え4

私のUbuntuシステムでext4を使用すると、 du -b file実際のファイルサイズ(バイト)とdu -b dirファイルサイズ(バイト)+ディレクトリオーバーヘッドが与えられます。私の場合、オーバーヘッドは4096バイトの倍数です。

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

回復することを確認するために再起動しようとしませんでしたが、どちらの場合も、履歴の状況に応じてディレクトリのサイズが変更されたことを意味します。

全体のサイズを正確に計算するには、各ファイルのサイズを計算するのがおそらく最良の方法です。文書サイズ。

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

OS Xでは、-b「du」オプションがなくても機能します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

関連情報