\r\n\r\n
linuxduコマンドを使用すると、実際のディスク使用量とファイルやディレクトリの実サイズを取得することができます。なぜこれらの値が同じでないのかを説明します。
ファイルのサイズとハードディスクに占める容量が同じであることはほとんどありません。ディスクの容量はブロック単位で割り当てられる。ファイルがブロックより小さい場合、ファイルシステムには使用する小さい不動産単位がないため、ブロック全体がそのファイルに割り当てられます。
ファイルのサイズが1ブロックの倍数でない限り、ハードディスク上の使用領域は常に次のブロックに切り上げられなければなりません。例えば、2ブロックより大きく3ブロックより小さいファイルでも、それを保存するために3ブロックの容量が必要になります。
ファイルサイズに関連する測定方法は2つあります。1つ目は、ファイルの実際のサイズ、つまり、ファイルを構成するコンテンツのバイト数です。もうひとつは、ハードディスク上のファイルの有効サイズです。これは、ファイルを格納するために必要なファイルシステムのブロック数である。
簡単な例として、ある文字をファイルにリダイレクトして小さなファイル:を作るところを見てみましょう。
echo "1" > geek.txtここでは、長文形式リスト ls を使って、文書の長さを表示することにします。
ls -l geek.txt長さは、dave エントリに続く数値、すなわち 2 バイトである。なぜ、1文字しか送らないのに、2バイトしか送らないのか?ファイルの中で何が起こっているか見てみましょう。
ここではhextumpコマンドを使って、正確なバイト数を出し、印字されない文字を16進数値で「見る」ことができるようにします。また、-C(canonical)オプションを使って、出力の本文に16進数の値を英数字の相当値と一緒に強制的に表示させることにします。
hexdump -C geek.txt出力は、ファイルのオフセット00000000から始まって、16進数値31を含むバイトと16進数値0Aを含むバイトがあることを示しています。 出力の右側の部分は、可能な限りこれらの値を英数字として記述しています。
16進数の31は数字の1を表し、16進数の0Aは改行を表し、英数字として表示できないため、ピリオド(.)で表示します。.改行文字はechoで付加される。デフォルトでは、echoはターミナルウィンドウに書き込むべきテキストを表示した後、新しい行を開始します。
これは、lsの出力と一致しており、2バイトのファイル長と一致する。
関連:Linuxでlsコマンドを使ってファイルやディレクトリを一覧表示する方法
ここでは、duコマンドを使って、ファイルサイズを表示することにします。
du geek.txt4番と書いてありますが、4番ってなんですか?
duがファイルサイズをブロックとして報告する場合、そのサイズはいくつかの要因に依存します。使用するブロックサイズは、コマンドラインから指定することができる。duが特定のブロックサイズを強制されない場合、どのブロックサイズを使用するかは一連のルールに従って決定されます。
まず、以下の環境変数をチェックします。
これらのいずれかが存在する場合、ブロックサイズが設定され、duはチェックを停止します。設定されていない場合、duのデフォルトは1024バイトのブロックサイズになります。POSIXLYu CORRECTという環境変数が設定されていない場合。この場合、duのデフォルトは512バイトのブロックサイズになります。
では、どれが使われているのかを調べるにはどうしたらいいのでしょうか。それぞれの環境変数を調べて計算してもいいのですが、もっと早い方法があります。その結果を、ファイルシステムが使用するブロックサイズと比較してみましょう。
ファイルシステムで使用されているブロックサイズを調べるために、tune2fs プログラムを使用します。次に、-l (list superblock) オプションを使って、出力を grep にパイプし、"Block" という単語を含む行を表示します。
この例では、最初のハードドライブの最初のパーティションであるsda1上のファイルシステムを見ますが、sudo:を使用する必要があります。
sudo tune2fs -l /dev/sda1 | grep Blockファイルシステムのブロックサイズは4096バイトです。これをdu(4)で割ると、duのデフォルトのブロックサイズは1024バイトであることを示す結果が得られます。私たちは今、大切なことを知りました。
まず、ファイルを格納するためのファイルシステムの最小容量は4096バイトであることが分かっています。つまり、私たちの小さな2バイトのファイルでさえ、ハードディスクの4キロバイトの容量を占めているのです。
第二に、du、ls、tune2fs などのハードディスクやファイルシステムの統計情報を報告する専用のアプリケーションは、「ブロック」の意味について異なる概念を持っているかもしれないことを覚えておいてください。ブロックサイズこれらのブロックサイズは、ファイルシステムのブロックサイズと関連付けることを意図したものではなく、単にこれらのコマンドの出力に使用される「ブロック」である。
最後に、duとtune2fsの答えは、ブロックサイズが異なることを除いて、同じ意味を持つ。
コマンドライン引数やオプションなしで、du は現在のディレクトリとすべてのサブディレクトリで使用されているディスク容量の合計を表示します。
例を見てみましょう。
duこのサイズは、デフォルトのブロックサイズ(1ブロック1024バイト)として報告されています。
du に現在のディレクトリとは別のディレクトリをレポートさせたい場合は、そのディレクトリへのパスをコマンドラインから
du ~/.cach/evolution/特定のファイルについてレポートしたい場合は、そのファイルへのパスをコマンドラインで渡します。また、シェルモードをユーザーに渡して、*.txt:などのファイルグループを選択することもできます。
du ~/.bash_aliasesカレントディレクトリとサブディレクトリにあるファイルについて報告させるには、-a (all files) オプションを使用します。
du -a各ディレクトリについて、各ファイルのサイズと各ディレクトリの総数を報告する。
duには、ディレクトリツリーをある深さまでリストアップするように指示することができます。そのためには、-d (max depth) オプションを使用し、引数として depth の値を指定します。すべてのサブディレクトリがスキャンされ、レポートの総数を計算するために使用されますが、それらはすべて表示されないことに注意してください。ディレクトリの最大深度を1レベルに設定するには、次のコマンドを使用します。
du -d 1出力は、カレントディレクトリのこのサブディレクトリの合計サイズをリストアップし、各サブディレクトリの合計サイズを提供します。
より深くディレクトリをリストアップするには、次のコマンドを使用します。
du -d 2Blockオプションで、現在操作しているduのブロックサイズを設定することができます。1バイトのブロックサイズを使用するには、次のコマンドを使用して、ディレクトリとファイルの正確なサイズを取得します。
du --block=1ブロックサイズを1メガバイトにするには、-m(メガバイト)オプションを使用します。これは、-block=1M:と同じです。
du -mディレクトリやファイルの使用するディスク容量に応じた最適なブロックサイズで報告するには、-h (human readable) オプションを使用します。
du -hファイルの保存に使われたハードディスクの容量ではなく、ファイルの外観サイズを見るには、--appearance size オプションを使用します。
du --apparent-sizeこのオプションは、-a(all)オプションと組み合わせて、各ファイルのサイズを確認することができます:。
du --apparent-size -a各ファイルとそのサイズが一覧表示されます。
duにディレクトリの総数だけを報告させたい場合は、-s (summary) オプションを使用します。このオプションは、-h(human readable)オプションなど、他のオプションと組み合わせて使用することもできます。
du -h -sここでは、--appearance sizeオプションと組み合わせて使用する。
du --apparent-size -s作成日時、最終修正日時を表示するには、-time オプションを使用します。
du --time -d 2du でおかしな結果が出た場合、特に他のコマンドの出力とサイズを相互参照した場合、通常、コマンドごとに異なるブロックサイズを設定したり、デフォルトのコマンドを設定したりすることが原因です。また、実際のファイルサイズとそれを保存するために必要なディスク容量の違いによる場合もあります。
他のコマンドの出力に合わせる必要がある場合は、du の --block オプションを試してみてください。