その行の定義は ls
にあります プラットフォームのドキュメント。 coreutils
の場合 ls
(多くの Linux システムで見られるもの)、情報は info coreutils ls
経由で見つけることができます :
リストされているディレクトリごとに、ファイルの前に「total BLOCKS」という行を付けます。ここで、BLOCKS は、そのディレクトリ内のすべてのファイルの合計ディスク割り当てです。
フォーミュラ:それとは 数?
<ブロック引用>合計 int =(physical_blocks_in_use) * physical_block_size/ls_block_size) の合計
場所:
ls_block_size
任意の環境変数です (通常は 512 または 1024 バイト)--block-size=<int>
で自由に変更可能ls
のフラグ 、POSIXLY_CORRECT=1
GNUenvironment 変数 (512 バイト単位を取得するため)、または-k
1kB ユニットを強制するフラグphysical_block_size
内部ブロック インターフェイスの OS 依存値であり、基盤となるハードウェアに接続されている場合と接続されていない場合があります。この値は通常 512b または 1k ですが、OS に完全に依存します。%B
で明らかになりますstat
の値 またはfstat
. この値は (ほとんどの場合) modern の物理ブロック数とは無関係であることに注意してください。 ストレージ デバイス。
どうしてそんなに混乱するの?
この数値は、物理的または意味のあるメトリックからかなり切り離されています。多くのジュニア プログラマーは、ファイル ホールやハード/シンボリック リンクの経験がありません。さらに、この特定のトピックに関するドキュメントは事実上存在しません。
「ブロック サイズ」という用語のまとまりのなさとあいまいさ さまざまな手段が混同されやすく、ディスク アクセスを中心に比較的深いレベルの抽象化が行われた結果です。
矛盾する情報の例:du
(または ls -s
) vs stat
du *
を実行中 プロジェクト フォルダに次のものが生成されます:(注:ls -s
同じ結果を返します。)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
合計 :2+2+1+3+3+5+26+4+2+14 =62 ブロック
それでも stat
を実行すると 異なる値のセットが表示されます。 stat
を実行中 同じディレクトリの結果:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
合計: 3+3+1+5+6+10+51+8+3+28 =118 ブロック
<ブロック引用>
注: コマンド stat * --printf="%b\t(%B)\t%n: %s bytes\n"
を使用できます> 上記のように、(順番に) ブロック数、(括弧内) それらのブロックのサイズ、ファイルの名前、バイト単位のサイズを出力します。
重要なポイントが 2 つあります:
stat
physical_blocks_in_use
の両方を報告します そしてphysical_block_size
上記の式で使用されているとおりです。これらは OS インターフェースに基づく値であることに注意してください。du
かなり正確な推定値として一般に受け入れられているものを提供しています 物理ディスクの使用率
参考までに、ここに ls -l
があります 上のディレクトリの:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
これは、リストされたファイルによって使用される、間接ブロックを含むファイル システム ブロックの総数です。 ls -s
を実行した場合 同じファイルで報告された数値を合計すると、同じ数値が得られます。