web-dev-qa-db-ja.com

コマンドラインからLinuxまたはMac OS Xディレクトリのサイズを取得する方法を教えてください。

LinuxまたはMac OS Xディレクトリ内のすべてのファイルのサイズを(再帰的に)見つけるために使用するコマンドは何ですか?

71
Daryl Spitzer

OS Xで使用されているduのBSDバージョンは、512バイトブロックのサイズを報告します - サイズは本質的に次の512バイト値に切り上げられます。これはディスク上のスペースを示しています。これはデータ量よりも大きいです。あなたがたくさんの小さなファイルを持っているならば、違いは大きいかもしれません。

これが一例です。

これは通常のduの値です。それは512バイトブロックです。

$ du -s
248   .

-hフラグは、読みやすい数(キロバイト単位)になります。予想通り、512バイトブロックの半分の数です。

$ du -hs
124K  .

最後に、findawkを使用して、ファイル内の実際のバイト数の合計を得ることができます。これはちょっと遅いですが、うまくいきます:

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

この値は、Finderの「情報を見る」ウインドウで報告された数と正確に一致します。 (このファイルのセットには奇妙なフォークやxattrはありません。)duで報告された値よりもかなり小さいです。

これがどのように動作するのかです:全てのファイルのリストを取得し、それらをls -lに渡します。次にawkを使ってバイトをカウントアップします。 -type fフラグはそこにあるので、ファイル(ディレクトリではなく)だけがlsに送られます。このフラグがなければ、ディレクトリ名もlsに送られ、各ファイルは2回リストされます。1回は個別のファイルとして、もう1回はディレクトリ内の項目としてです。

duのGNUバージョンでは、ブロックではなく実際のバイト数で値を指定できます。 BSD版のduがそれほど柔軟ではないことは残念です。

79
wch

単一ファイルのサイズを表示

du -h path_to_a_file

ディレクトリ、各サブディレクトリ、および各ファイルの内容のサイズを表示します。

du -h path_to_a_directory

ディレクトリの内容のサイズを表示します。

du -sh path_to_a_directory

75
Daryl Spitzer

du - ディスクサイズを示しますファイルサイズを示しません.

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

上記の端末コード(osx 10.6ではim)は私に最良の結果を提供し、 "find ... -exec"よりもずっと速いです。

簡単なベンチマーク

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
9
Acid

すべてのファイルとディレクトリのサイズを再帰的に表示するdu -ah .を使うことができます。

これはsortと組み合わせることができるので、現在のフォルダ内でトップ20の最大ディレクトリが表示されます。

du -ah . | sort -rh | head -20

注:sortのオプション-hはOSX/BSDでは利用できないので、sortから(例えばcoreutilsを介して)brewをインストールし、ビンパスをPATHに適用する必要があります。

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

そうでなければ:

du -a . | sort -rn | head -20
5
kenorb

私はあなたのすべてのapprouchesを結合し、それを人間が読める出力と結合しました。

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

要旨へのリンク: https://Gist.github.com/mlegenhausen/9365461

2
malte