Linuxでファイルまたはディレクトリのサイズを取得する方法

  • ファイルの実際のサイズ(ファイルを構成するバイト数)と、ハードディスク上の有効なサイズ(ファイルを保存するために必要なファイルシステムブロック数)は、ディスク容量がブロック単位で割り当てられるため異なります。
  • duコマンドを使用して、ファイル、ディレクトリ、およびカレントディレクトリとサブディレクトリによって使用される合計ディスク容量のサイズを確認できます。
  • 「du -h」を実行して、ファイルとフォルダーのリストを人間が判読できる形式で表示します。

Linuxのduコマンドを使用すると、実際のディスク使用量とファイルまたはディレクトリの実際のサイズを取得できます。これらの値が同じではない理由を説明します。

実際のディスク使用量と実際のサイズが異なるのはなぜですか?

ファイルのサイズとハードドライブ上の占有容量は、ほとんどの場合同じではありません。ディスク容量はブロック単位で割り当てられます。ファイルがブロックよりも小さい場合でも、ファイルシステムにはそれを使用するより小さな単位がないため、ブロック全体が割り当てられます。

ファイルのサイズがブロックの倍数でない場合、ハードドライブ上の使用領域は常に次のブロックに切り上げられます。たとえば、ファイルが2つのブロックより大きく、3つより小さい場合でも、3つのブロックの領域が必要になります。

ファイルサイズに関して2つの測定値が使用されます。1つ目はファイルの実際のサイズで、ファイルを構成するコンテンツのバイト数です。2つ目は、ハードディスク上のファイルの有効なサイズです。これは、そのファイルを格納するために必要なファイルシステムブロックの数です。

ファイルのサイズを確認する方法

簡単な例を見てみましょう。1文字をファイルにリダイレクトして、小さなファイルを作成します。

echo "1" > geek.txt

次に、長い形式のリスト、lsを使用して、ファイルの長さを見てみます。

ls -l geek.txt

長さは、dave daveのエントリに続く数値で、2バイトです。ファイルに1文字しか送信していないのに、なぜ2バイトなのでしょうか? ファイル内で何が起こっているのかを見てみましょう。

hexdumpコマンドを使用すると、正確なバイト数が得られ、非表示文字を16進値として「表示」できます。また、-C(正規)オプションを使用して、出力の本文に16進値とその英数字の文字列を強制的に表示します。

hexdump -C geek.txt

出力には、ファイルのオフセット00000000から始まり、16進値31を含むバイトと、16進値0Aを含むバイトがあることが示されています。出力の右半分には、可能な限り、これらの値が英数字として表示されます。

16進値31は数字の1を表すために使用されます。16進値0Aは改行文字を表すために使用されますが、英数字として表示することはできないため、代わりにピリオド(.)として表示されます。改行文字はechoによって追加されます。デフォルトでは、echoはターミナルウィンドウに書き込む必要があるテキストを表示した後、新しい行を開始します。

これは、lsの出力と一致し、ファイルの長さ2バイトと一致します。

次に、duコマンドを使用してファイルのサイズを確認します。

du geek.txt

サイズは4であると表示されますが、何の4でしょうか?

ブロックとブロックがあります

duがブロック単位でファイルサイズを報告する場合、使用するサイズはいくつかの要素によって異なります。コマンドラインで使用するブロックサイズを指定できます。duが特定のブロックサイズを使用するように強制しない場合、どのブロックサイズを使用するかを決定するためのルールに従います。

最初に、以下の環境変数を確認します。

  • DU_BLOCK_SIZE
  • BLOCK_SIZE
  • BLOCKSIZE

これらが存在する場合、ブロックサイズは設定され、duは確認を停止します。いずれも設定されていない場合、duはデフォルトで1,024バイトのブロックサイズになります。ただし、POSIXLY_CORRECTという環境変数が設定されている場合を除きます。その場合、duはデフォルトで512バイトのブロックサイズになります。

では、どれが使用されているかをどのように確認するのでしょうか? 各環境変数を確認して調べることもできますが、より迅速な方法があります。代わりに、ファイルシステムが使用するブロックサイズと結果を比較してみましょう。

ファイルシステムが使用するブロックサイズを確認するには、tune2fsプログラムを使用します。次に、-l(スーパーブロックのリスト)オプションを使用して、出力をgrepにパイプし、単語「ブロック」を含む行を出力します。

この例では、最初のハードドライブの最初のパーティション、sda1のファイルシステムを見ていきます。sudoを使用する必要があります。

sudo tune2fs -l /dev/sda1 | grep Block

ファイルシステムのブロックサイズは4,096バイトです。これをdu(4)から得た結果で割ると、duのデフォルトのブロックサイズは1,024バイトであることがわかります。これで、いくつかの重要なことがわかりました。

まず、ファイルの保存に使用できるファイルシステムの最小の領域は4,096バイトであることがわかりました。つまり、わずか2バイトのファイルでも、ハードドライブの領域を4KB消費しています。

2つ目に覚えておくべきことは、ハードドライブとファイルシステムの統計を報告することに特化したアプリケーション(dulstune2fsなど)は、「ブロック」の意味について異なる概念を持つ可能性があるということです。tune2fsアプリケーションは真のファイルシステムのブロックサイズを報告しますが、lsduは他のブロックサイズを使用するように設定または強制することができます。これらのブロックサイズは、ファイルシステムのブロックサイズに関連するものではありません。これらのコマンドが出力に使用する「チャンク」にすぎません。

最後に、異なるブロックサイズを使用していることを除けば、dutune2fsの回答は同じ意味を伝えています。tune2fsの結果は4,096バイトの1つのブロックで、duの結果は1,024バイトの4つのブロックでした。

duを使用してファイルサイズを確認する

コマンドラインのパラメータやオプションがない場合、duはカレントディレクトリとすべてのサブディレクトリが使用している合計ディスク領域をリストします。

例を見てみましょう。

du

サイズは、デフォルトのブロックサイズである1ブロックあたり1,024バイトで報告されます。サブディレクトリツリー全体が走査されます。

別のディレクトリでduを使用する

duでカレントディレクトリ以外のディレクトリを報告したい場合は、コマンドラインでディレクトリへのパスを渡すことができます。

du ~/.cach/evolution/

特定のファイルでduを使用する

duで特定のファイルを報告したい場合は、そのファイルへのパスをコマンドラインで渡します。*.txtなどのファイルのグループを選択するために、シェルパターンを渡すこともできます。

du ~/.bash_aliases

ディレクトリ内のファイルを報告する

duでカレントディレクトリとサブディレクトリ内のファイルを報告するには、-a(すべてのファイル)オプションを使用します。

du -a

各ディレクトリについて、各ファイルのサイズと各ディレクトリの合計が報告されます。

ディレクトリツリーの深さを制限する

duにディレクトリツリーを特定の深さまでリストするように指示することができます。これを行うには、-d(最大深度)オプションを使用して、パラメータとして深度値を指定します。すべてのサブディレクトリがスキャンされて報告された合計を計算するために使用されますが、すべてがリストされるわけではありません。最大ディレクトリ深度を1レベルに設定するには、次のコマンドを使用します。

du -d 1

出力には、カレントディレクトリ内のそのサブディレクトリの合計サイズがリストされ、それぞれに合計が示されます。

ディレクトリを1レベル深くリストするには、次のコマンドを使用します。

du -d 2

ブロックサイズの設定

blockオプションを使用して、現在の操作のduのブロックサイズを設定することができます。ブロックサイズを1バイトにするには、次のコマンドを使用してディレクトリとファイルの正確なサイズを取得します。

du --block=1

ブロックサイズを1メガバイトにする場合は、-m(メガバイト)オプションを使用することができます。これは--block=1Mと同じです。

du -m

ディレクトリとファイルが使用するディスク容量に応じて、最も適切なブロックサイズでサイズを報告したい場合は、-h(人間が判読できる)オプションを使用します。

du -h

ファイルを保存するために使用されたハードドライブの領域ではなく、ファイルの見かけ上のサイズを確認するには、--apparent-sizeオプションを使用します。

du --apparent-size

これを-a(すべて)オプションと組み合わせて、各ファイルの見かけ上のサイズを確認することができます。

du --apparent-size -a

各ファイルとその見かけ上のサイズがリストされます。

合計のみを表示する

duにディレクトリの合計のみを報告させたい場合は、-s(要約)オプションを使用します。これは、-h(人間が判読できる)オプションなどの他のオプションと組み合わせることもできます。

du -h -s

ここでは、--apparent-sizeオプションと一緒に使用します。

du --apparent-size -s

変更時刻を表示する

作成時刻または最終変更時刻と日付を確認するには、--timeオプションを使用します。

du --time -d 2

奇妙な結果?

duから奇妙な結果が表示された場合、特に他のコマンドからの出力とサイズを相互参照した場合、通常は、異なるコマンドに設定できるブロックサイズやデフォルトのブロックサイズが異なることが原因です。ファイルの実際のサイズと、それらを保存するために必要なディスク領域の違いが原因である可能性もあります。

他のコマンドの出力を一致させる必要がある場合は、du--blockオプションを試してください。