NIX/Linux標準ツールを使用して実際のディレクトリサイズを取得するにはどうすればよいですか?
別の質問:duを取得して、実際のディレクトリサイズ(ディスク使用量ではない)を表示するにはどうすればよいですか?
「サイズ」という用語の定義は人によって異なるようです。「ディレクトリサイズ」の私の定義は、そのディレクトリ内のすべての通常のファイルの合計です。
ディレクトリのiノードのサイズや、ファイルがそれぞれのファイルシステムで占有する(ブロック*ブロックサイズ)のサイズは気にしません。 3バイトのファイルが1つあるディレクトリのディレクトリサイズは3バイトです(私の定義によると)。
Duを使用してディレクトリサイズを計算することは信頼できないようです。
たとえば、mkdir foo && du -b foo
は "4096 foo"を報告します。0バイトではなく4096バイトです。ディレクトリが非常に大きい場合、du -hs
によって報告されるディレクトリサイズは、100 GB(!)以上(圧縮ファイルシステム)オフになる可能性があります。
実際のディレクトリサイズを取得するために使用する必要がある(ツール/オプション)は何ですか?
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
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
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
代わりに、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。
必要なのは、ディレクトリが占めるスペースを除いて、ファイルのサイズだけであれば、次のようにすることができます
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}'