web-dev-qa-db-ja.com

ls -lの後の最初の行の「合計」とは何ですか?

ls -lの出力のtotalとは何ですか?

    $ ls -l /etc
    total 3344
    -rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
    -rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
    drwxr-xr-x   4 root root    4096 Feb  2  2007 acpi
    -rw-r--r--   1 root root      48 Feb  8  2008 adjtime
    drwxr-xr-x   4 root root    4096 Feb  2  2007 alchemist
118
Sanket Sahu

プラットフォームのlsドキュメントでその行の定義を見つけることができます。 coreutilsls(多くのLinuxシステムで見られるもの)の場合、情報はinfo coreutils ls

リストされているディレクトリごとに、ファイルの先頭に「total BLOCKS」という行を追加します。BLOCKSは、そのディレクトリ内のすべてのファイルの合計ディスク割り当てです。

86
Mat

式:that番号とは何ですか?

合計int=(physical_blocks_in_use)* physical_block_size/ls_block_size)の合計。

ここで:

  • ls_block_size任意の環境変数(通常512または1024バイト)であり、ls上の--block-size=<int>フラグ、POSIXLY_CORRECT=1 GNU環境変数(512バイト単位を取得する)、または-kフラグを使用して1kB単位を強制します。
  • physical_block_sizeは、内部ブロックインターフェイスのOS依存値であり、基盤となるハードウェアに接続されている場合とされていない場合があります。この値は通常512bまたは1kですが、OSに完全に依存しています。これは、statまたはfstat%B値を通じて明らかにできます。 この値は、(ほとんど常に)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_usephysical_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
42
Don Scott

これは、リストされたファイルによって使用される、間接ブロックを含むファイルシステムブロックの総数です。 ls -s同じファイルで報告された数値を合計すると、同じ数値が得られます。

26
Dave Lasley

言うまでもありません--h(ls -lh)を使用して、人間が読める形式に変換できます。

18