ls -lの後の最初の行の「合計」は何ですか?[閉まっている]


131

何であるtotalの出力ではls -l

    $ 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

回答:


94

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

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


14
おかしなことにman ls、私のシステムではその行に言及していませんが、言及してinfo coreutils lsいます。どのように来るman lsとは、info coreutils ls同じコマンドに関するさまざまな情報がありますか?なぜls一度だけ文書化されていないのですか?同じコマンドに対して2つの異なるドキュメントがあると、失敗するように設定されているように見えます。
HelloGoodbye 2016年

1
infocoreutilsに関するドキュメントは、manページよりも詳細であることがよくあります。そのため、各manページの最後に、詳細についてはinfoセクションを参照するよう注意書きを付けています。
Mat

7
ああ。実行するinfo lsと、と同じ出力が得られinfo coreutils lsます。議論coreutilsは何をしますか?
HelloGoodbye 2016年

46

公式:その数は何ですか?

合計int = 各ファイルの(physical_blocks_in_use)* physical_block_size / ls_block_size)の合計。

どこ:

  • ls_block_sizeある任意の環境変数と自由に変更可能である(通常は512または1024バイト) --block-size=<int>上のフラグlsPOSIXLY_CORRECT=1(512バイト単位を取得する)GNU環境変数、または-kフラグが1kBの単位を強制します。
  • physical_block_size内部ブロックインターフェイスのOS依存の値であり、基盤となるハードウェアに接続されている場合とされていない場合があります。この値は通常512bまたは1kですが、OSに完全に依存しています。またはの%B値で明らかにできます。 この値は(ほとんどの場合)最新のストレージデバイス上の物理ブロックの数とは無関係であることに注意してくださいstatfstat

なぜそんなに混乱するのですか?

この数値は、物理的または意味のあるメトリックからかなり切り離されています。多くのジュニアプログラマーは、ファイルホールハード/シンボリックリンクの経験がありません。さらに、この特定のトピックで利用できるドキュメントは事実上存在しません。

「ブロックサイズ」という用語のばらばらさとあいまいさは、多数の異なる測定値が簡単に混同され、ディスクアクセスを中心に展開する比較的深いレベルの抽象化の結果です。

矛盾する情報の例:( duまたはls -s)と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

26

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


これは単に真実ではありません。例:/bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
ドンスコット

3
どのシステムを使用しているかはわかりませんが、私にとって本当です。例:gist.github.com/rfjakob/200f6001bf91cf801891
Jakob

@Jakob完全な回答を投稿しました。確認して、問題が解決したかどうかをお知らせください。
ドンスコット

これは、Git bash for Windowsでは当てはまりません。
thdoan 2017年

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