web-dev-qa-db-ja.com

実際のディレクトリサイズを取得するには(duから)?

NIX/Linux標準ツールを使用して実際のディレクトリサイズを取得するにはどうすればよいですか?

別の質問:duを取得して、実際のディレクトリサイズ(ディスク使用量ではない)を表示するにはどうすればよいですか?

「サイズ」という用語の定義は人によって異なるようです。「ディレクトリサイズ」の私の定義は、そのディレクトリ内のすべての通常のファイルの合計です。

ディレクトリのiノードのサイズや、ファイルがそれぞれのファイルシステムで占有する(ブロック*ブロックサイズ)のサイズは気にしません。 3バイトのファイルが1つあるディレクトリのディレクトリサイズは3バイトです(私の定義によると)。

Duを使用してディレクトリサイズを計算することは信頼できないようです。
たとえば、mkdir foo && du -b fooは "4096 foo"を報告します。0バイトではなく4096バイトです。ディレクトリが非常に大きい場合、du -hsによって報告されるディレクトリサイズは、100 GB(!)以上(圧縮ファイルシステム)オフになる可能性があります。

実際のディレクトリサイズを取得するために使用する必要がある(ツール/オプション)は何ですか?

17
basic6

Unix標準ツール(POSIX)を使用して人間が読めるディレクトリサイズを表示するスクリプトを次に示します。

#!/bin/sh
find ${1:-.} -type f -exec ls -lnq {} \+ | awk '
BEGIN {sum=0} # initialization for clarity and safety
function pp() {
  u="+Ki+Mi+Gi+Ti+Pi+Ei";
  split(u,unit,"+");
  v=sum;
  for(i=1;i<7;i++) {
    if(v<1024) break;
    v/=1024;
  }
  printf("%.3f %sB\n", v, unit[i]);
}
{sum+=$5}
END{pp()}'

例えば:

$ ds ~        
72.891 GiB
8
jlliagre

duの一部のバージョンは、ディスク使用量ではなく見かけのサイズを表示するための引数--apparent-sizeをサポートしています。したがって、コマンドは次のようになります。

du -hs --apparent-size

Ubuntu 12.04 LTSに含まれるduのmanページから:

--apparent-size
      print apparent sizes,  rather  than  disk  usage;  although  the
      apparent  size is usually smaller, it may be larger due to holes
      in (`sparse') files, internal  fragmentation,  indirect  blocks,
      and the like
8
Brian

GNU coreutilsからのduがあると仮定すると、このコマンドは、ファイル数の任意の制限なしに、ディレクトリ内の任意の数の通常ファイルの見かけの合計サイズを計算する必要があります。

find . -type f -print0 | du -scb --files0-from=- | tail -n 1

内部にハードリンクされたファイルがあり、各ハードリンクを個別にカウントする場合は、-lオプションをduに追加します(デフォルトでは、duは複数のハードリンクを1回だけカウントします)。

単純なdu -sbとの最も重要な違いは、再帰的なduもディレクトリのサイズをカウントすることです。これは、ファイルシステムごとに異なる方法で報告されます。これを回避するには、findコマンドを使用して、通常のファイルのみをduに渡します。もう1つの違いは、シンボリックリンクが無視されることです(それらをカウントする必要がある場合は、findコマンドを調整する必要があります)。

du -sbを使用するとduにデバイスとiノード番号all処理されたファイルの数が保存されるため、このコマンドはプレーン--files0-from=FILEよりも多くのメモリを消費します。複数のハードリンクを持つファイルのみを記憶するデフォルトの動作。 (-lオプションを使用してハードリンクを複数回カウントする場合、これは問題ではありません。デバイスとiノード番号を格納する唯一の理由は、すでに処理されたハードリンクファイルをスキップすることです。)

人間が読み取れる合計サイズの表現を取得する場合は、-hオプションを追加するだけです(これは、他の推奨される回答とは異なり、duが1回だけ呼び出されて合計サイズ自体を計算するため機能します):

find . -type f -print0 | du -scbh --files0-from=- | tail -n 1

または(-bの一部の効果が-hによって上書きされることが心配な場合)

find . -type f -print0 | du -sc --apparent-size -h --files0-from=- | tail -n 1
6
Sergey Vlasov

代わりに、lsを使用します。

ls -nR | grep -v '^d' | awk '{total += $5} END {print total, "Total"}'

ls -nR-n お気に入り -l、ただし数値のUIDとGID、および-Rサブディレクトリを再帰的にリストします。

grep -v:一致していない行を選択するには、一致の意味を反転します。 (-vはPOSIXによって指定されます。) '^ d'はディレクトリを除外します。

Lsコマンド: http://linux.about.com/od/commands/l/blcmdl1_ls.htm

Man Grep: http://linux.die.net/man/1/grep

[〜#〜]編集[〜#〜]

提案として編集@ @ Sergey Vlasov。

4
stderr

必要なのは、ディレクトリが占めるスペースを除いて、ファイルのサイズだけであれば、次のようにすることができます

find . -type f -print0 | xargs -0 du -scb | tail -n 1

@SergeyVlasovは、 argmax より多くのファイルがある場合、これは失敗することを指摘しました。それを回避するには、次のようなものを使用できます。

find . -type f -exec du -sb '{}' \; | gawk '{k+=$1}END{print k}'
3
terdon