LinuxまたはMac OS Xディレクトリ内のすべてのファイルのサイズを(再帰的に)見つけるために使用するコマンドは何ですか?
OS Xで使用されているdu
のBSDバージョンは、512バイトブロックのサイズを報告します - サイズは本質的に次の512バイト値に切り上げられます。これはディスク上のスペースを示しています。これはデータ量よりも大きいです。あなたがたくさんの小さなファイルを持っているならば、違いは大きいかもしれません。
これが一例です。
これは通常のdu
の値です。それは512バイトブロックです。
$ du -s
248 .
-h
フラグは、読みやすい数(キロバイト単位)になります。予想通り、512バイトブロックの半分の数です。
$ du -hs
124K .
最後に、find
とawk
を使用して、ファイル内の実際のバイト数の合計を得ることができます。これはちょっと遅いですが、うまくいきます:
$ 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
がそれほど柔軟ではないことは残念です。
単一ファイルのサイズを表示
du -h path_to_a_file
ディレクトリ、各サブディレクトリ、および各ファイルの内容のサイズを表示します。
du -h path_to_a_directory
ディレクトリの内容のサイズを表示します。
du -sh path_to_a_directory
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
すべてのファイルとディレクトリのサイズを再帰的に表示する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
私はあなたのすべての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 } }}'